如果你希望将 Quarkus 的 @QuarkusMain 主类放置在外部依赖(例如 SDK)中,这完全是可行的,但前提是必须显式启用该依赖的类路径索引机制。否则,运行时将无法识别你的主类,应用也就无法正常启动。下面就来详细解析如何通过 quarkus-index-dependency 或 jandex-maven-plugin 这两种方式,让跨模块的主入口稳定运行。
Quarkus 允许你将带有 @QuarkusMain 注解的主类定义在外部依赖模块中,例如一个独立的 SDK。然而,关键在于,框架在构建原生镜像或 JVM 模式启动时,必须预先知道哪些类携带了 @QuarkusMain、@ApplicationScoped 等关键注解。这一识别过程依赖于 Jandex 索引。
默认情况下,Quarkus 只会自动索引当前模块以及直接声明的 Quarkus 扩展依赖——其他普通依赖中的注解类,它并不会自动扫描。这就引出了一个问题:如果 @QuarkusMain 所在的类定义在像 test-sdk 这样的纯业务 SDK 依赖中,而你并未为其配置索引,Quarkus 启动器就会完全忽略这个主类。最终结果是,日志静默无输出,应用毫无反应,形成典型的“静默失败”场景。
✅ 终极解决方案:正确启用依赖索引
要让 test-sdk 中的 @QuarkusMain 被成功识别,有以下两种主流且高效的实现路径。
方案一:使用 quarkus-index-dependency(推荐,原生支持)
在 test-project 的 pom.xml 中,为 test-sdk 这个依赖添加一个分类器即可:
org.example test-sdk 1.0.0 quarkus-index-dependency
⚠️ 注意:此方案要求 test-sdk 在构建时已生成带有 quarkus-index-dependency 分类器的 JAR 文件。因此,你需要在 test-sdk 的 pom.xml 中配置 Quarkus Maven 插件,使其自动产出该分类器:
io.quarkus quarkus-maven-plugin ${quarkus.version} build Quarkus Maven 插件会为项目自动生成一个包含索引的分类器 JAR,其中内嵌了 META-INF/jandex.idx 文件。这免去了额外配置 Jandex 插件的繁琐步骤。
方案二:手动集成 jandex-maven-plugin(兼容旧版或自定义场景)
如果你的 SDK 未使用 Quarkus 插件构建,或者你需要更精细的控制,则可以在 test-sdk 的 pom.xml 中直接添加 jandex 插件:
org.jboss.jandex jandex-maven-plugin 1.3.2 make-index jandex
构建完成后,test-sdk-1.0.0.jar 内部将会包含一个 META-INF/jandex.idx 文件。此时,test-project 只需正常引用该 JAR,Quarkus 就能自动发现并识别它。
