Класс 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() |
Возвращает строковое описание этой конфигурации. |
Подробное описание методов
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. Кроме того, ни одно из следующих условий не выполняется:Mtrue:-
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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/module/Configuration.html