Перейти к основному содержимому

Обнаружение Quarkus Bean с индексированием Jandex

· 3 мин. чтения

1. Обзор

В этой статье мы узнаем разницу между обнаружением bean-компонентов в Quarkus и классическими средами Jakarta EE. Мы сосредоточимся на том, как обеспечить, чтобы Quarkus мог обнаруживать аннотированные классы во внешних модулях.

2. Почему Quarkus нуждается в индексировании

Одним из основных преимуществ Quarkus является чрезвычайно быстрая загрузка. Для этого Quarkus переносит такие этапы, как сканирование аннотаций пути к классам, из среды выполнения во время сборки. Для этого нам нужно объявить все зависимости во время сборки.

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

Давайте рассмотрим разницу, используя простой эскиз:

./0dd1718be7ec1ebcfe24a4deb33422a0.svg

Quarkus использует Jandex для создания и чтения индекса.

3. Создайте индекс

Для классов в нашем проекте Quarkus нам не нужно делать ничего особенного — подключаемый модуль Quarkus Maven автоматически сгенерирует индекс. Но нам нужно обратить внимание на зависимости — внутренние модули проекта, а также внешние библиотеки.

3.1. Плагин Яндекс Maven

Самый очевидный способ добиться этого для наших собственных модулей — использовать плагин Jandex Maven :

<build>
<plugins>
<plugin>
<!-- https://github.com/wildfly/jandex-maven-plugin -->
<groupId>org.jboss.jandex</groupId>
<artifactId>jandex-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<id>make-index</id>
<goals>
<!-- phase is 'process-classes by default' -->
<goal>jandex</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

Этот подключаемый модуль создает файл «META-INF/jandex.idx» , упакованный в JAR. Quarkus считывает этот файл, когда он предоставляется библиотекой во время выполнения. Таким образом, каждая библиотека, содержащая такой файл, неявно расширяет индекс.

Для сборки Gradle мы можем использовать плагин org.kordamp.gradle.jandex :

plugins {
id 'org.kordamp.gradle.jandex' version '0.11.0'
}

3.2. Свойства приложения

Если мы не можем изменить зависимости (например, в случае внешних библиотек), нам нужно указать их явно в файле application.properties проекта Quarkus :

quarkus.index-dependency.<name>.group-id=<groupId> quarkus.index-dependency.<name>.artifact-id=<artifactId> quarkus.index-dependency.<name>.classifier=(optional)

3.3. Заданные платформой последствия

Вместо использования подключаемого модуля Jandex Maven модуль также может содержать файл META-INF/beans.xml . На самом деле это часть технологии CDI, которая принята в Quarkus с некоторыми корректировками , но мы не ограничены использованием только bean-компонентов, управляемых CDI . Мы также могли бы объявить, например, ресурсы JAX-RS, поскольку область действия индекса — это весь модуль.

4. Вывод

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

Как всегда, весь код доступен на GitHub . Существует многомодульный проект, содержащий приложение Quarkus и некоторые зависимости, которые предоставляют bean-компоненты, управляемые CDI.