Класс Configuration
public final class Configuration extends Object
Конфигурация инкапсулирует граф читаемости, являющийся результатом разрешения. Граф читаемости — это ориентированный граф, вершины которого имеют тип ResolvedModule, а рёбра представляют читаемость между модулями. Configuration определяет метод modules() для получения набора разрешённых модулей в графе.
ResolvedModule определяет метод reads() для получения набора модулей, читаемых разрешённым модулем. Читаемые модули могут находиться в той же конфигурации или в parent конфигурациях.
Configuration определяет метод resolve для разрешения коллекции корневых модулей и метод resolveAndBind для разрешения с привязкой служб. Для обоих методов существуют варианты экземпляра и статические варианты. Методы экземпляра создают конфигурацию, в которой вызывающий объект является родительской конфигурацией. Статические методы предназначены для более сложных случаев, когда родительских конфигураций может быть несколько.
Каждый layer модулей в виртуальной машине Java создаётся на основе конфигурации. Конфигурация для boot слоя получается вызовом
ModuleLayer.boot().configuration(). Конфигурация загрузочного слоя часто выступает родительской при создании новых конфигураций.
Необязательные службы
Разрешение требует, чтобы если модульM 'uses' службу или 'provides' реализацию службы, то служба была доступна для M во время выполнения либо потому, что M сам содержит пакет службы, либо потому, что M читает другой модуль, экспортирующий пакет службы. Однако иногда желательно, чтобы пакет службы поступал из модуля, который во время выполнения является необязательным, что обозначается использованием 'requires static' в этом примере: module M {
requires static Y;
uses p.S;
}
module Y {
exports p;
}
M есть необязательная зависимость от некоторого модуля Y, но Y не требуется во время выполнения (Y может быть видимым, но на него никто не ссылается), то при разрешении во время выполнения предполагается, что Y экспортировал пакет службы во время компиляции. Разрешение во время выполнения не пытается проверить, видим ли Y и (если он видим) экспортирует ли Y пакет службы. Модуль, который 'uses' службу или 'provides' её реализацию, может напрямую зависеть от необязательного модуля, как это делает M выше, либо может зависеть от необязательного модуля косвенно, как показано здесь:
module M {
requires X;
uses p.S;
}
module X {
requires static transitive Y;
}
module Y {
exports p;
}
M 'uses' или реализацию которой 'provides', является необязательной, если она поступает из необязательной зависимости. В этом случае код в M должен быть готов к тому, что класс или интерфейс, обозначающий службу, окажется недоступен во время выполнения. Это отличается от более обычного случая, когда служба доступна, но реализации службы отсутствуют. Пример
В следующем примере используется метод resolve для разрешения модуля с именем myapp, используя конфигурацию загрузочного слоя в качестве родительской конфигурации. Пример выводит имя каждого разрешённого модуля и имена модулей, которые читает каждый модуль.
Path dir1 = ..., dir2 = ..., dir3 = ...;
ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3);
Configuration parent = ModuleLayer.boot().configuration();
Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("myapp"));
cf.modules().forEach(m -> {
System.out.format("%s -> %s%n",
m.name(),
m.reads().stream()
.map(ResolvedModule::name)
.collect(Collectors.joining(", ")));
});
- Начиная с:
- 9
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static Configuration |
empty() |
Возвращает пустую конфигурацию. |
Optional |
findModule |
Находит разрешённый модуль в этой конфигурации или, если его здесь нет, в родительских конфигурациях. |
Set |
modules() |
Возвращает неизменяемый набор разрешённых модулей в этой конфигурации. |
List |
parents() |
Возвращает неизменяемый список родительских конфигураций в порядке поиска. |
Configuration |
resolve |
Разрешает коллекцию корневых модулей, используя эту конфигурацию в качестве родительской, чтобы создать новую конфигурацию. |
static Configuration |
resolve |
Разрешает коллекцию корневых модулей, чтобы создать конфигурацию. |
Configuration |
resolveAndBind |
Разрешает коллекцию корневых модулей с привязкой служб, используя эту конфигурацию в качестве родительской, чтобы создать новую конфигурацию. |
static Configuration |
resolveAndBind |
Разрешает коллекцию корневых модулей с привязкой служб, чтобы создать конфигурацию. |
String |
toString() |
Возвращает строку с описанием этой конфигурации. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли этот объект какому-либо другому объекту. |
protected void |
finalize() |
Устарело, планируется удаление: этот элемент API планируется удалить в будущей версии. Финализация устарела и планируется к удалению в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает значение хеш-кода этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
Подробное описание методов
resolve
public Configuration resolve(ModuleFinder before, ModuleFinder after, Collection<String> roots)
resolve, если вызвать его с этой конфигурацией в качестве родительской. Другими словами, если эта конфигурация является cf, то этот метод эквивалентен вызову: Configuration.resolve(before, List.of(cf), after, roots);
- Параметры:
-
before— средство поиска модулей до для поиска модулей -
after— средство поиска модулей после для поиска модулей, не найденных средством поиска модулейbeforeили в родительских конфигурациях -
roots— возможно, пустая коллекция имён модулей, которые требуется разрешить - Возвращает:
- Конфигурацию, полученную в результате разрешения указанных корневых модулей
- Выбрасывает:
-
FindException— если разрешение завершается с ошибкой по одной из причин, связанных с видимостью, указанных для статического методаresolve -
ResolutionException— если разрешение завершается с ошибкой при выполнении одной из проверок согласованности, указанных для статического методаresolve
resolveAndBind
public Configuration resolveAndBind(ModuleFinder before, ModuleFinder after, Collection<String> roots)
resolveAndBind, если вызвать его с этой конфигурацией в качестве родительской. Другими словами, если эта конфигурация является cf, то этот метод эквивалентен вызову: Configuration.resolveAndBind(before, List.of(cf), after, roots);
- Параметры:
-
before— средство поиска модулей до для поиска модулей -
after— средство поиска модулей после для поиска модулей, не найденных средством поиска модулейbeforeили в родительских конфигурациях -
roots— возможно, пустая коллекция имён модулей, которые требуется разрешить - Возвращает:
- Конфигурацию, полученную в результате разрешения указанных корневых модулей с привязкой служб
- Выбрасывает:
-
FindException— если разрешение завершается с ошибкой по одной из причин, связанных с видимостью, указанных для статического методаresolve -
ResolutionException— если разрешение завершается с ошибкой при выполнении одной из проверок согласованности, указанных для статического методаresolve
resolve
public static Configuration resolve(ModuleFinder before, List<Configuration> parents, ModuleFinder after, Collection<String> roots)
Каждый корневой модуль ищется с помощью указанного средства поиска модулей before. Если модуль не найден, он ищется в родительской конфигурации, как если бы для каждого родителя в порядке обхода был вызван метод findModule. Если модуль не найден, он ищется с помощью указанного средства поиска модулей after. Для поиска транзитивных зависимостей используется тот же порядок поиска. Корневые модули или зависимости, найденные в родительской конфигурации, больше не разрешаются и не включаются в результирующую конфигурацию.
После перечисления всех модулей вычисляется граф читаемости, который проверяется на согласованность с учётом экспортов модулей и использования служб.
Разрешение может завершиться с FindException по следующим причинам, связанным с видимостью:
Корневой модуль или прямая либо транзитивная зависимость не найдены.
При попытке найти модуль возникает ошибка. Возможные ошибки включают ошибки ввода-вывода, ошибки, обнаруженные при разборе дескриптора модуля (
module-info.class), а также обнаружение двух версий одного модуля в одном каталоге.
Разрешение может завершиться с ResolutionException, если не пройдёт любая из следующих проверок согласованности:
Обнаружен цикл, например, когда модуль
m1требует модульm2, аm2требуетm1.Модуль читает два или более модулей с одинаковым именем. Сюда относится случай, когда модуль читает другой модуль с тем же именем, что и у него самого.
Два или более модулей в конфигурации экспортируют один и тот же пакет в модуль, который читает их оба. Сюда относится случай, когда модуль
M, содержащий пакетp, читает другой модуль, экспортирующийpвM.-
Модуль
Mобъявляет, что он 'uses p.S' или 'provides p.S with ...', но пакетpотсутствует в модулеMи не экспортируется вMни одним из модулей, которые читаетM. Кроме того, ни одно из следующих условий не являетсяtrue:-
Mобъявляет 'requires static' для хотя бы одного модуля, отсутствующего в графе читаемости. -
Mчитает другой модуль, объявляющий 'requires transitive static' для хотя бы одного модуля, отсутствующего в графе читаемости.
-
- Примечание по реализации:
- В реализации видимость модулей может зависеть от ссылочной целостности или других проверок, гарантирующих, что разные сборки тесно связанных модулей либо модулей для определённых операционных систем или архитектур не объединяются в одной конфигурации.
- Параметры:
-
before— средство поиска модулей до для поиска модулей -
parents— список родительских конфигураций в порядке поиска -
after— средство поиска модулей после для поиска модулей, не найденных средством поиска модулейbeforeили в родительских конфигурациях -
roots— возможно, пустая коллекция имён модулей, которые требуется разрешить - Возвращает:
- Конфигурацию, полученную в результате разрешения указанных корневых модулей
- Выбрасывает:
-
FindException— если разрешение завершается с ошибкой по любой из указанных выше причин, связанных с видимостью -
ResolutionException— если разрешение завершается с ошибкой при выполнении любой из указанных выше проверок согласованности -
IllegalArgumentException— если список родителей пуст или содержит две или более родительские конфигурации с модулями для разных целевых операционных систем, архитектур или версий
resolveAndBind
public static Configuration resolveAndBind(ModuleFinder before, List<Configuration> parents, ModuleFinder after, Collection<String> roots)
Этот метод работает точно так, как указано в resolve, за исключением того, что граф разрешённых модулей дополняется модулями, обусловленными отношением зависимости от использования служб.
В частности, корневые модули разрешаются так, как если бы был вызван resolve. Затем проверяются разрешённые модули и все модули в родительских конфигурациях, содержащие service dependences. Все модули, найденные указанными средствами поиска модулей и provide реализацию одного или нескольких типов служб, добавляются в граф модулей и затем разрешаются так, как если бы был вызван метод
resolve. Добавление модулей в граф модулей может ввести новые зависимости от использования служб, поэтому процесс повторяется до тех пор, пока не перестанут добавляться новые модули.
Поскольку привязка служб включает разрешение, она может завершиться с
FindException или ResolutionException по тем же причинам, которые указаны в resolve.
- Параметры:
-
before— средство поиска модулей до для поиска модулей -
parents— список родительских конфигураций в порядке поиска -
after— средство поиска модулей после для поиска модулей, не найденных средством поиска модулейbeforeили в родительских конфигурациях -
roots— возможно, пустая коллекция имён модулей, которые требуется разрешить - Возвращает:
- Конфигурацию, полученную в результате разрешения указанных корневых модулей с привязкой служб
- Выбрасывает:
-
FindException— если разрешение завершается с ошибкой по одной из причин, связанных с видимостью, указанных для статического методаresolve -
ResolutionException— если разрешение завершается с ошибкой при выполнении любой из проверок согласованности, указанных для статического методаresolve -
IllegalArgumentException— если список родителей пуст или содержит две или более родительские конфигурации с модулями для разных целевых операционных систем, архитектур или версий
empty
public static Configuration empty()
- Возвращает:
- Пустую конфигурацию
parents
public List<Configuration> parents()
- Возвращает:
- Возможно, пустой неизменяемый список родительских конфигураций
modules
public Set<ResolvedModule> modules()
- Возвращает:
- Возможно, пустой неизменяемый набор разрешённых модулей в этой конфигурации
findModule
public Optional<ResolvedModule> findModule(String name)
findModule для каждого родителя в порядке поиска, пока модуль не будет найден или не будут проверены все родители. В дереве конфигураций это эквивалентно поиску в глубину.- Параметры:
-
name— имя искомого разрешённого модуля - Возвращает:
- Разрешённый модуль с указанным именем или пустой
Optional, если модуль с таким именем отсутствует в этой конфигурации и во всех родительских конфигурациях
toString
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.