Spec-Zone.ru › OpenJDK 24

Пакет java.lang.module

package java.lang.module
Классы для поддержки описателей модулей и создания конфигураций модулей с помощью разрешения и привязки сервисов.

Если не указано иное, передача аргумента null в конструктор или метод любого класса или интерфейса в этом пакете вызовет исключение NullPointerException. Кроме того, вызов метода с массивом или коллекцией, содержащей элемент null, вызовет исключение NullPointerException, если не указано иное.

Разрешение модулей

Разрешение — это процесс вычисления того, как модули зависят друг от друга. Этот процесс происходит во время компиляции и выполнения.

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

Шаг 1: Рекурсивное перечисление

Рекурсивное перечисление принимает набор имён модулей, ищет объявления каждого из них и для каждого объявления модуля рекурсивно перечисляет:

  • имена модулей, заданные директивами 'requires' с модификатором 'transitive', и

  • по усмотрению хост-системы, имена модулей, заданные директивами 'requires' без модификатора 'transitive'.

Объявления модулей ищутся в наборе наблюдаемых модулей. Набор наблюдаемых модулей определяется способом, специфичным для реализации. Набор наблюдаемых модулей может включать модули с явными объявлениями (то есть с файлом исходного кода module-info.java или файлом module-info.class) и модули с неявными объявлениями (то есть автоматические модули). Поскольку у автоматического модуля нет явного объявления модуля, у него нет собственных директив 'requires', хотя его имя может быть задано директивой 'requires' явного объявления модуля.

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

Если по крайней мере один автоматический модуль перечисляется этим алгоритмом, то каждый наблюдаемый автоматический модуль должен быть перечислен, независимо от того, заданы ли их имена директивами 'requires' явных объявлений модулей.

Если происходит хотя бы одно из следующих условий, то разрешение завершается неудачно:

  • Любой корневой модуль не является наблюдаемым.

  • Любой модуль, имя которого задано директивой 'requires' с модификатором 'transitive', не является наблюдаемым.

  • По усмотрению хост-системы, любой модуль, имя которого задано директивой 'requires' без модификатора 'transitive', не является наблюдаемым.

  • Алгоритм на этом шаге перечисляет одно и то же имя модуля дважды. Это указывает на цикл в директивах 'requires', игнорируя любые модификаторы 'transitive'.

В противном случае разрешение переходит к шагу 2.

Шаг 2: Вычисление графа читаемости

Директива 'requires' (независимо от 'transitive') выражает, что один модуль зависит от другого. Эффект модификатора 'transitive' заключается в том, что дополнительные модули также зависят от другого модуля. Если модуль M 'requires transitive N', то не только M зависит от N, но и любой модуль, который зависит от M, также зависит от N. Это позволяет переработать M таким образом, чтобы часть или весь его контент можно было переместить в новый модуль N без нарушения модулей, имеющих директиву 'requires M'.

Зависимости модулей представляются графом читаемости. Граф читаемости — это ориентированный граф, вершинами которого являются модули, перечисленные на шаге 1, а рёбрами представляют читаемость между парами модулей. Рёбра определяются следующим образом:

Во-первых, читаемость определяется директивами 'requires' перечисленных модулей, игнорируя любые модификаторы 'transitive':

  • Для каждого перечисленного модуля A, который 'requires' B: A "читает" B.

  • Для каждого перечисленного автоматического модуля X: X "читает" каждый другой перечисленный модуль (это как если бы у автоматического модуля были директивы 'requires' для каждого другого перечисленного модуля).

Во-вторых, читаемость дополняется с учётом модификаторов 'transitive':

  • Для каждого перечисленного модуля A, который "читает" B:

    • Если B 'requires transitive' C, то A "читает" C также, как и B. Это дополнение рекурсивно: так как A "читает" C, если C 'requires transitive' D, то A "читает" D также, как и C и B.

    • Если B — автоматический модуль, то A "читает" каждый другой перечисленный автоматический модуль. (Это как если бы у автоматического модуля были директивы 'requires transitive' для каждого другого перечисленного автоматического модуля).

Наконец, каждый модуль "читает" сам себя.

Если в графе читаемости выполняются какие-либо из следующих условий, то разрешение завершается неудачно:

  • Модуль "читает" два или более модулей с одинаковым именем. Это включает случай, когда модуль "читает" другой модуль с тем же именем, что и у него самого.

  • Два или более модулей экспортируют пакет с одинаковым именем в модуль, который "читает" оба. Это включает случай, когда модуль M, содержащий пакет p, "читает" другой модуль, который экспортирует p в M.

  • Модуль M объявляет, что он 'uses p.S' или 'provides p.S with ...', но пакет p находится ни в модуле M, ни в экспортированном M любым модулем, который M "читает".

В противном случае разрешение завершается успешно, и результатом разрешения является граф читаемости.

Корневые модули

Набор корневых модулей во время компиляции обычно представляет собой набор компилируемых модулей. Во время выполнения набор корневых модулей обычно представляет собой модуль приложения, указанный в загрузчике 'java'. При компиляции кода в безымянном модуле или во время выполнения, когда основной класс приложения загружается из пути к классам, то набор корневых модулей по умолчанию специфичен для реализации. В JDK набор корневых модулей по умолчанию содержит каждый модуль в пути к обновляемому модулю или среди системных модулей, которые экспортируют по крайней мере один пакет, без квалификации.

Наблюдаемые модули

Набор наблюдаемых модулей как во время компиляции, так и во время выполнения определяется поиском по нескольким различным путям, а также поиском компилированных модулей, встроенных в среду. Порядок поиска следующий:

  1. Только во время компиляции, путь к модулю компиляции. Этот путь содержит определения модулей в исходной форме.

  2. Путь к обновляемому модулю. Этот путь содержит скомпилированные определения модулей, которые будут наблюдаться с предпочтением перед скомпилированными определениями любых обновляемых модулей, которые присутствуют в (3) и (4). См. Java SE Platform для определения того, какие стандартные модули являются обновляемыми.

  3. Системные модули, которые представляют собой скомпилированные определения, встроенные в среду.

  4. Путь к модулю приложения. Этот путь содержит скомпилированные определения библиотек и приложений.

Директивы 'requires' с модификатором 'static'

Директивы 'requires', имеющие модификатор 'static', выражают необязательную зависимость во время выполнения. Если модуль объявляет, что он 'requires static M', то разрешение не ищет наблюдаемые модули для M, чтобы удовлетворить зависимость. Однако, если M рекурсивно перечисляется на шаге 1, то все модули, которые перечисляются и `requires static M`, будут читать M.

Полнота

Разрешение может быть частичным во время компиляции, так как полное транзитивное замыкание может не потребоваться для компиляции набора модулей. Минимально, граф читаемости, который строится и проверяется во время компиляции, включает компилируемые модули, их прямые зависимости и все неявные объявленные зависимости (requires transitive).

Во время выполнения разрешение является аддитивным процессом. Рекурсивное перечисление на шаге 1 может быть относительным к предыдущим разрешениям, так что корневой модуль или модуль, указанный в директиве 'requires', не перечисляется, когда он был перечислен предыдущим (или родительским) разрешением. Граф читаемости, являющийся результатом разрешения, может, следовательно, иметь вершину для модуля, перечисленного на шаге 1, но с ребром, указывающим, что модуль читает модуль, который был перечислен предыдущим (или родительским) разрешением.

Since:
9
Пакет Описание
java.lang
Предоставляет классы, являющиеся фундаментом для разработки на языке Java.
Класс Описание
Configuration
Конфигурация, полученная в результате разрешения или разрешения с связыванием сервисов.
FindException
Выбрасывается ModuleFinder при ошибке поиска модуля.
InvalidModuleDescriptorException
Выбрасывается при чтении дескриптора модуля, если дескриптор имеет неверный формат или не может быть интерпретирован как дескриптор модуля.
ModuleDescriptor
Дескриптор модуля.
ModuleDescriptor.Builder
Построитель объектов ModuleDescriptor.
ModuleDescriptor.Exports
Экспортируемый пакет модуля, может быть квалифицированным или неквалифицированным.
ModuleDescriptor.Exports.Modifier
Модификатор экспортируемого пакета.
ModuleDescriptor.Modifier
Модификатор модуля.
ModuleDescriptor.Opens
Открытый пакет модуля, может быть квалифицированным или неквалифицированным.
ModuleDescriptor.Opens.Modifier
Модификатор открытого пакета.
ModuleDescriptor.Provides
Сервис, предоставляемый модулем, с одним или несколькими реализациями.
ModuleDescriptor.Requires
Зависимость от модуля.
ModuleDescriptor.Requires.Modifier
Модификатор зависимости от модуля.
ModuleDescriptor.Version
Строка версии модуля.
ModuleFinder
Поисковик модулей.
ModuleReader
Предоставляет доступ к содержимому модуля.
ModuleReference
Ссылка на содержимое модуля.
ResolutionException
Выбрасывается при неудачном разрешении набора модулей или разрешении набора модулей со связыванием сервисов.
ResolvedModule
Модуль в графе разрешенных модулей.

© 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/module/package-summary.html

Spec-Zone.ru

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