Spec-Zone.ru › OpenJDK 25

Класс Configuration

java.lang.Object
java.lang.module.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
См. также:
  • 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()
Возвращает строковое описание этой конфигурации.

Методы, объявленные в классе 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

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 true:

    • 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

public String toString()
Возвращает строковое описание этой конфигурации.
Переопределяет:
toString в классе Object
Возвращает:
Возможно, пустая строка с описанием этой конфигурации

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API