Spec-Zone.ru › OpenJDK 25

Интерфейс ModuleFinder

public interface ModuleFinder
Средство поиска модулей. ModuleFinder используется для поиска модулей во время разрешения или связывания служб.

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

Пример использования:

    Path dir1 = ..., dir2 = ..., dir3 = ...;
    ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3);
    Optional<ModuleReference> omref = finder.find("jdk.foo");
    omref.ifPresent(mref -> ... );

Методы find и findAll, определённые здесь, могут завершиться ошибкой по нескольким причинам. К ним относятся ошибки ввода-вывода, ошибки, обнаруженные при разборе дескриптора модуля (module-info.class), а также, в случае ModuleFinder, возвращённого методом ModuleFinder.of, обнаружение в каталоге двух или более модулей с одинаковым именем. При обнаружении ошибки эти методы выбрасывают FindException с соответствующим cause. Поведение ModuleFinder после выбрасывания FindException не определено. Например, вызов find после выбрасывания исключения может как просканировать, так и не просканировать те же модули, которые привели к исключению. Рекомендуется отказаться от использования средства поиска модулей после выбрасывания исключения.

ModuleFinder не обязано быть потокобезопасным.

Начиная с:
9

Краткое описание методов

Модификатор и тип Метод Описание
static ModuleFinder compose(ModuleFinder... finders)
Возвращает средство поиска модулей, составленное из последовательности, содержащей ноль или более средств поиска модулей.
Optional<ModuleReference> find(String name)
Находит ссылку на модуль с заданным именем.
Set<ModuleReference> findAll()
Возвращает набор всех ссылок на модули, которые может найти это средство поиска.
static ModuleFinder of(Path... entries)
Возвращает средство поиска модулей, которое находит модули в файловой системе, выполняя поиск в последовательности каталогов и/или упакованных модулей.
static ModuleFinder ofSystem()
Возвращает средство поиска модулей, которое находит системные модули.

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

find

Optional<ModuleReference> find(String name)
Находит ссылку на модуль с заданным именем.

ModuleFinder обеспечивает согласованное представление найденных им модулей. Если find вызывается несколько раз для поиска одного и того же модуля (по имени), он каждый раз возвращает один и тот же результат. Если модуль найден, гарантируется, что он входит в набор модулей, возвращаемый методом findAll.

Параметры:
name — имя искомого модуля
Возвращает:
Ссылку на модуль с заданным именем или пустой Optional, если модуль не найден
Выбрасывает:
FindException — если при поиске модуля произошла ошибка

findAll

Set<ModuleReference> findAll()
Возвращает набор всех ссылок на модули, которые может найти это средство поиска.

ModuleFinder обеспечивает согласованное представление найденных им модулей. Если findAll вызывается несколько раз, каждый раз он возвращает один и тот же результат (равный предыдущему). Для каждого элемента ModuleReference в возвращённом наборе гарантируется, что find найдёт ModuleReference, если будет вызван для поиска этого модуля.

Примечание API:
Это необходимо для таких методов, как resolveAndBind, которым нужно просканировать путь к модулям, чтобы найти модули, предоставляющие определённую службу.
Возвращает:
Набор всех ссылок на модули, найденных этим средством поиска
Выбрасывает:
FindException — если при поиске всех модулей произошла ошибка

ofSystem

static ModuleFinder ofSystem()
Возвращает средство поиска модулей, которое находит системные модули. Системные модули — это модули в образе среды выполнения Java. Средство поиска модулей всегда находит java.base.
Возвращает:
ModuleFinder, которое находит системные модули

of

static ModuleFinder of(Path... entries)
Возвращает средство поиска модулей, которое находит модули в файловой системе, выполняя поиск в последовательности каталогов и/или упакованных модулей. Каждый элемент заданного массива представляет собой один из следующих вариантов:
  1. Путь к каталогу модулей.

  2. Путь к каталогу верхнего уровня распакованного модуля.

  3. Путь к упакованному модулю.

Средство поиска модулей ищет модули в каждом каталоге, распакованном модуле или упакованном модуле в порядке индексов массива. Оно находит первое вхождение модуля с заданным именем и игнорирует другие модули с этим именем, расположенные дальше по последовательности.

Если элемент представляет собой путь к каталогу модулей, каждая запись в каталоге является упакованным модулем или каталогом верхнего уровня распакованного модуля. Если каталог содержит более одного модуля с одинаковым именем, возникает ошибка. Если элемент является путём к каталогу, содержащему файл с именем module-info.class, каталог считается распакованным модулем, а не каталогом модулей.

Средство поиска модулей, возвращаемое этим методом, поддерживает модули, упакованные в виде JAR-файлов. JAR-файл с module-info.class в каталоге верхнего уровня или в версионированной записи многорелизного JAR-файла является модульным JAR-файлом и, следовательно, определяет явный модуль. JAR-файл, в каталоге верхнего уровня которого нет module-info.class, определяет автоматический модуль следующим образом:

  • Если в основном манифесте JAR-файла есть атрибут «Automatic-Module-Name», его значение является именем модуля. В противном случае имя модуля выводится из имени JAR-файла.

  • version, а также имя модуля, если атрибут «Automatic-Module-Name» отсутствует, выводятся из имени файла JAR-файла следующим образом:

    • Удаляется суффикс «.jar».

    • Если имя соответствует регулярному выражению "-(\\d+(\\.|$))", имя модуля выводится из подпоследовательности перед дефисом при его первом вхождении. Подпоследовательность после дефиса разбирается как Version и игнорируется, если её не удаётся разобрать как Version.

    • Все неалфавитно-цифровые символы ([^A-Za-z0-9]) в имени модуля заменяются точкой ("."), последовательности повторяющихся точек заменяются одной точкой, а начальные и конечные точки удаляются.

    • Например, для JAR-файла с именем «foo-bar.jar» будет выведено имя модуля «foo.bar» без версии. Для JAR-файла с именем «foo-bar-1.2.3-SNAPSHOT.jar» будет выведено имя модуля «foo.bar» и версия «1.2.3-SNAPSHOT».

  • Набор пакетов модуля выводится из записей JAR-файла, не являющихся каталогами и имена которых заканчиваются на «.class». Кандидат на имя пакета выводится из имени записи с использованием символов до последней косой черты, не включая её. Все остальные косые черты заменяются точками ("."). Если полученная строка является допустимым именем пакета, она считается именем пакета. Например, если JAR-файл содержит запись «p/q/Foo.class», то выводимое имя пакета — «p.q».

  • Содержимое записей, начинающихся с META-INF/services/, считается файлами конфигурации служб (см. ServiceLoader). Если имя файла (следующего за META-INF/services/) является допустимым именем класса, оно считается полным именем типа службы. Записи в файле считаются полными именами классов поставщиков.

  • Если в основном манифесте JAR-файла есть атрибут Main-Class, его значение является допустимым именем класса, а пакет этого класса входит в набор пакетов, выведенных для модуля, то это значение является главным классом модуля.

Если для автоматического модуля невозможно создать ModuleDescriptor с помощью API ModuleDescriptor.Builder, выбрасывается FindException. Это может произойти, если значение атрибута «Automatic-Module-Name» не является допустимым именем модуля, если из имени файла JAR-файла невозможно вывести допустимое имя модуля, если в каталоге верхнего уровня JAR-файла содержится .class, если запись в файле конфигурации службы не является допустимым именем класса или имя его пакета не входит в набор пакетов, выведенных для модуля.

Помимо JAR-файлов, реализация может также поддерживать модули, упакованные в другие, специфичные для реализации форматы модулей. Если элемент массива, переданного этому методу, является путём к каталогу модулей, записи в каталоге, не распознанные как модули, игнорируются. Если элемент массива является путём к нераспознанному упакованному модулю, при обращении к файлу выбрасывается FindException. Пути к несуществующим файлам всегда игнорируются.

Как и в случае автоматических модулей, содержимое упакованного или распакованного модуля может потребоваться просканировать, чтобы определить пакеты в модуле. Игнорирование скрытых файлов зависит от реализации и поэтому не специфицировано. Если в каталоге верхнего уровня найден файл .class (кроме module-info.class), он считается классом в безымянном пакете, поэтому выбрасывается FindException.

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

Параметры:
entries — возможно, пустой массив путей к каталогам модулей или путей к упакованным либо распакованным модулям
Возвращает:
ModuleFinder, которое находит модули в файловой системе

compose

static ModuleFinder compose(ModuleFinder... finders)
Возвращает средство поиска модулей, составленное из последовательности, содержащей ноль или более средств поиска модулей. Метод find полученного средства поиска модулей находит модуль, вызывая метод find каждого средства поиска модулей в порядке индексов массива, пока модуль не будет найден или не будут проверены все средства поиска модулей. Метод findAll полученного средства поиска модулей возвращает набор модулей, включающий все модули, найденные первым средством поиска модулей. Набор модулей также включает все модули, найденные вторым или последующими средствами поиска модулей, которые не были найдены предшествующими средствами поиска в последовательности.

При поиске модулей любые исключения или ошибки, выброшенные методами find или findAll базовых средств поиска модулей, передаются вызывающему коду методов find или findAll полученного средства поиска модулей.

Параметры:
finders — массив средств поиска модулей
Возвращает:
ModuleFinder, объединяющее последовательность средств поиска модулей

Сообщить об ошибке или предложить улучшение
Дополнительные справочные сведения по 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/ModuleFinder.html

Spec-Zone.ru

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