1. Обзор
В этой статье мы узнаем разницу между обнаружением bean-компонентов в Quarkus и классическими средами Jakarta EE. Мы сосредоточимся на том, как обеспечить, чтобы Quarkus мог обнаруживать аннотированные классы во внешних модулях.
2. Почему Quarkus нуждается в индексировании
Одним из основных преимуществ Quarkus является чрезвычайно быстрая загрузка. Для этого Quarkus переносит такие этапы, как сканирование аннотаций пути к классам, из среды выполнения во время сборки. Для этого нам нужно объявить все зависимости во время сборки.
Таким образом, расширение приложения с помощью пути к классам в среде выполнения больше невозможно. Индексация вступает в игру, когда во время сборки собираются метаданные. Индексация означает хранение метаданных в индексном файле. Это позволяет приложению быстро считывать его при запуске или всякий раз, когда это необходимо.
Давайте рассмотрим разницу, используя простой эскиз:
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.