如何在Quarkus中为外部模块中的类创建Jandex索引

时间:2019-04-04 10:20:37

标签: java multi-module quarkus

首先,我有一个像这样的多模块Maven层次结构:

├── project (parent pom.xml)
│   ├── service
│   ├── api-library

现在解决问题:

我正在使用api库中的类的服务模块中编写一个JAX-RS端点。
当我开始quarkus时,我得到以下警告:

13:01:18,784 WARN  [io.qua.dep.ste.ReflectiveHierarchyStep] Unable to properly register the hierarchy of the following classes for reflection as they are not in the Jandex index:
- com.example.Fruit
- com.example.Car
Consider adding them to the index either by creating a Jandex index for your dependency or via quarkus.index-dependency properties.

com.example.Fruitcom.example.Car类位于api-library模块中。

所以我认为我需要将它们添加到application.properties中的Jandex索引依赖项中。

但是如何将Jandex索引依赖项添加到quarkus中?

3 个答案:

答案 0 :(得分:5)

Quarkus自动索引主模块,但是,当您拥有包含CDI bean,实体,序列化为JSON的对象的附加模块时,您需要显式索引它们。

有两个不同的选项(易于实现)。

使用Jandex Maven插件

只需将以下内容添加到您的pom.xml中:

<build>
  <plugins>
    <plugin>
      <groupId>org.jboss.jandex</groupId>
      <artifactId>jandex-maven-plugin</artifactId>
      <version>1.0.5</version>
      <executions>
        <execution>
          <id>make-index</id>
          <goals>
            <goal>jandex</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

如果依赖项在项目外部,并且您希望一劳永逸地建立索引,这是最有益的选择。

添加一个空的META-INF / beans.xml

如果您在META-INF/beans.xml中添加一个空的src/main/resources文件,这些类也将被索引。

这些类将被Quarkus本身索引。

索引其他依赖项

如果您不能修改依赖关系(例如,考虑第三方依赖关系),则仍可以通过在application.properties中添加条目来对其建立索引:

quarkus.index-dependency.<name>.group-id=
quarkus.index-dependency.<name>.artifact-id=
quarkus.index-dependency.<name>.classifier=(this one is optional)

使用<name>作为您用来识别依赖项的名称。

答案 1 :(得分:0)

我曾尝试添加Jandex索引,添加beans.xml以及将其他依赖项编入索引,如@emre-işık答案中所述,但是我的第三方类(EpAutomationRs)未注册为在本机模式下进行反射。 因此,我最终得到了一个快速且肮脏的注册解决方案(请参阅下文)。 我创建了一个未使用的REST JSON端点,该端点返回了该类。

/**
 * the purpose of this method is to register for reflection EpAutomationRs class
 *
 * @return
 */
@GET
@Path(GET_EMPTY_RS)
@Produces(MediaType.APPLICATION_JSON)
public EpAutomationRs entry() {
    return new EpAutomationRs();
}

答案 2 :(得分:0)

对于gradle用户,您可以在所依赖模块的build.gradle中使用this插件。