Класс 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(", ")));
    });
Since:
9
См. также:
ModuleLayer

Методы

Модификатор и тип Метод Описание
static Configuration empty()

Возвращает пустую конфигурацию.

Optional<ResolvedModule> findModule​(String name)

Находит разрешённый модуль в этой конфигурации или, если его нет в этой конфигурации, в родительских конфигурациях.

Set<ResolvedModule> modules()

Возвращает неизменяемый набор разрешённых модулей в этой конфигурации.

List<Configuration> parents()

Возвращает список родительских конфигураций этой конфигурации, отсортированный по порядку поиска.

Configuration resolve​(ModuleFinder before, ModuleFinder after, Collection<String> roots)

Разрешает набор корневых модулей, используя эту конфигурацию как родительскую, чтобы создать новую конфигурацию.

static Configuration resolve​(ModuleFinder before, List<Configuration> parents, ModuleFinder after, Collection<String> roots)

Разрешает набор корневых модулей для создания конфигурации.

Configuration resolveAndBind​(ModuleFinder before, ModuleFinder after, Collection<String> roots)

Разрешает набор корневых модулей с привязкой сервисов и с этой конфигурацией как родительской, чтобы создать новую конфигурацию.

static Configuration resolveAndBind​(ModuleFinder before, List<Configuration> parents, ModuleFinder after, Collection<String> roots)

Разрешает набор корневых модулей с привязкой сервисов для создания конфигурации.

String toString()

Возвращает строковое описание этой конфигурации.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

Методы

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, 2020, 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/11/docs/api/java.base/java/lang/module/Configuration.html

Spec-Zone .ru
спецификации, руководства, описания, API