Класс 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 -
SecurityException- Если доступ к модулю запрещён менеджером безопасности
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 -
SecurityException- Если доступ к модулю запрещён менеджером безопасности
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- Если список родителей пуст или в списке есть два или более родителя с модулями для разных целевых операционных систем, архитектур или версий -
SecurityException- Если доступ к модулю запрещён менеджером безопасности
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- Если список родителей пуст или в списке есть два или более родителя с модулями для разных целевых операционных систем, архитектур или версий -
SecurityException- Если доступ к модулю запрещён менеджером безопасности
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
public String toString()
- Переопределяет:
-
toStringв классеObject - Возвращает:
- Возможная пустая строка, описывающая эту конфигурацию
© 1993, 2023, 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/21/docs/api/java.base/java/lang/module/Configuration.html