Search code examples
javamulti-modulequarkus

How to create a Jandex index in Quarkus for classes in a external module


First of all, I have a multi-module maven hierarchy like that:

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

So now to the problem:

I am writing a JAX-RS Endpoint in the service module which uses classes in the api-library.
When I start quarkus, I am getting this warning:

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.

This two classes com.example.Fruit and com.example.Car are located in the api-library module.

So I think I need to add them to the Jandex index-dependency in the application.properties.

But how can I add Jandex index-dependencies into quarkus?


Solution

  • Quarkus automatically indexes the main module but, when you have additional modules containing CDI beans, entities, objects serialized as JSON, you need to explicitly index them.

    There are a couple of different (easy to implement) options to do so.

    Using the Jandex Maven plugin

    Add the following to the pom.xml of the module you want to index:

        <build>
          <plugins>
            <plugin>
              <groupId>io.smallrye</groupId>
              <artifactId>jandex-maven-plugin</artifactId>
              <version>3.1.2</version>
              <executions>
                <execution>
                  <id>make-index</id>
                  <goals>
                    <goal>jandex</goal>
                  </goals>
                </execution>
              </executions>
            </plugin>
          </plugins>
        </build>
    

    It's the most beneficial option if your dependency is external to your project and you want to build the index once and for all.

    Using the Gradle Jandex plugin

    If you are using Gradle, there is a third party plugin allowing to generate a Jandex index: https://github.com/kordamp/jandex-gradle-plugin .

    Adding an empty META-INF/beans.xml

    If you add an empty META-INF/beans.xml file in the additional module src/main/resources, the classes will also be indexed.

    The classes will be indexed by Quarkus itself.

    Indexing other dependencies

    If you can't modify the dependency (think of a third-party dependency, for instance), you can still index it by adding an entry to your application.properties:

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

    with <name> being a name you choose to identify your dependency.