Интерфейс 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 не обязан быть потокобезопасным.

Since:
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 - Если при поиске модуля произошла ошибка
SecurityException - Если доступ запрещён менеджером безопасности

findAll

Set<ModuleReference> findAll()

Возвращает набор всех ссылок на модули, которые может найти этот поиск.

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

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

ofSystem

static ModuleFinder ofSystem()

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

Если установлен менеджер безопасности, то вызывается его метод checkPermission для проверки того, что вызывающей стороне предоставлено разрешение RuntimePermission("accessSystemModules") на доступ к системным модулям.

Возвращает:
Поиск ModuleFinder , который находит системные модули
Исключения:
SecurityException - Если доступ запрещён менеджером безопасности

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" в главном манифесте, то его значение является именем модуля module-info.class. В противном случае имя модуля выводится из имени файла 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" в главном манифесте, его значение является допустимым именем класса, а его пакет входит в набор пакетов, полученных для модуля, то значение является основным классом модуля Main-Class.

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

В дополнение к файлам 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 , который объединяет последовательность поисковиков модулей

© 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/ModuleFinder.html

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