Класс Configuration
public final class Configuration extends Object
Конфигурация инкапсулирует граф разрешимости, который является результатом разрешения. Граф разрешимости — это ориентированный граф, вершины которого имеют тип ResolvedModule, а рёбра представляют разрешимость между модулями. Configuration определяет метод modules() для получения набора разрешенных модулей в графе.
ResolvedModule определяет метод reads() для получения набора модулей, которые считывает разрешенный модуль. Считываемые модули могут находиться в той же конфигурации или в конфигурациях родителей.
Конфигурация определяет метод resolve для разрешения набора корневых модулей и метод resolveAndBind для разрешения со связыванием сервисов. Существуют экземплярные и статические варианты обоих методов. Экземплярные методы создают конфигурацию с получателем в качестве родительской конфигурации. Статические методы предназначены для более сложных случаев, когда может быть более одной родительской конфигурации.
Каждый layer модулей в виртуальной машине Java создаётся из конфигурации. Конфигурация для boot слоя получается вызовом
ModuleLayer.boot().configuration(). Конфигурация для слоя загрузки часто используется в качестве родителя при создании новых конфигураций.
Пример
В следующем примере используется метод resolve для разрешения модуля с именем myapp с конфигурацией для слоя загрузки в качестве родительской конфигурации. Он выводит имя каждого разрешенного модуля и имена модулей, которые каждый модуль считывает.
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<ResolvedModule> |
findModule |
Находит разрешённый модуль в этой конфигурации или, если его нет, в родительских конфигурациях. |
Set<ResolvedModule> |
modules() |
Возвращает неизменяемый набор разрешенных модулей в этой конфигурации. |
List<Configuration> |
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()
- Возвращает:
- Пустую конфигурацию
родители
public List<Configuration> parents()
- Возвращает:
- Возможный пустой неизменяемый список родительских конфигураций
модули
public Set<ResolvedModule> modules()
- Возвращает:
- Возможный пустой неизменяемый набор решённых модулей в этой конфигурации
findModule
public Optional<ResolvedModule> findModule(String name)
findModule для каждой родительской конфигурации в порядке поиска, пока модуль не будет найден или все родительские конфигурации не будут проверены. В дереве конфигураций это эквивалентно поиску в глубину.- Параметры:
-
name- Имя модуля разрешенного модуля для поиска - Возвращает:
- Разрешенный модуль с заданным именем или пустой
Optional, если в этой конфигурации или любой родительской конфигурации нет модуля с этим именем
toString
public String toString()
- Переопределяет:
-
toStringв классеObject - Возвращает:
- Возможная пустая строка, описывающая эту конфигурацию
© 1993, 2021, 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/17/docs/api/java.base/java/lang/module/Configuration.html