Класс Configuration
public final class Configuration extends Object
Конфигурация инкапсулирует граф читаемости, который является результатом разрешения. Граф читаемости — это ориентированный граф, вершины которого имеют тип ResolvedModule, а рёбра представляют взаимосвязь по чтению между модулями. Configuration определяет метод modules() для получения набора разрешённых модулей в графе.
ResolvedModule определяет метод reads() для получения набора модулей, которые читает разрешенный модуль. Модули, которые читаются, могут находиться в той же конфигурации или в родительских конфигурациях.
Конфигурация определяет метод resolve для разрешения набора корневых модулей и метод resolveAndBind для разрешения с привязкой сервисов. Существуют варианты методов для экземпляров и статические. Методы экземпляров создают конфигурацию с получателем в качестве родительской конфигурации. Статические методы предназначены для более сложных случаев, когда может быть более одной родительской конфигурации.
Каждый layer модулей в виртуальной машине Java создаётся из конфигурации. Конфигурация для boot слоя получается путём вызова
ModuleLayer.boot().configuration(). Конфигурация для загрузочного слоя часто используется в качестве родительской при создании новых конфигураций.
Пример
В следующем примере используется метод 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(", ")));
});
- Since:
- 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ни одним модулем, которыйMсчитывает.
- Примечание для реализации:
- В реализации наблюдаемость модулей может зависеть от целостности ссылок или других проверок, которые гарантируют, что различные сборки тесно связанных модулей или модулей для определенных операционных систем или архитектур не комбинируются в одной конфигурации.
- Параметры:
-
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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/module/Configuration.html