Spec-Zone.ru › OpenJDK 27

Класс 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
Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, равен ли этот объект какому-либо другому объекту.
protected void finalize()
Устарело, планируется удаление: этот элемент API планируется удалить в будущей версии.
Финализация устарела и планируется к удалению в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает значение хеш-кода этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени.

Подробное описание методов

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, 2026, 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.

Spec-Zone.ru

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