Quarkus 允许将 @QuarkusMain 标注的主类定义在外部依赖(如 SDK 模块)中,但需显式配置依赖索引,否则构建原生镜像时该主类不会被识别和执行。
quarkus 允许将 `@quarkusmain` 标注的主类定义在外部依赖(如 sdk 模块)中,但需显式配置依赖索引,否则构建原生镜像时该主类不会被识别和执行。
在 Quarkus 构建流程中,尤其是生成原生镜像(native image)阶段,框架仅自动扫描当前项目模块及其直接声明的、被标记为 quarkus-bootstrap 友好或显式索引的依赖中的 @QuarkusMain 类。若主类(如 org.example.Main)位于 test-sdk 这类纯库依赖中,而 test-project 未主动告知 Quarkus “该依赖包含可启动入口”,则构建器会忽略它——这正是你观察到日志未输出的根本原因。
✅ 正确做法:显式启用依赖索引
需在 test-project 的 pom.xml 中,通过 quarkus-maven-plugin 配置 additional-application-classes 或更推荐的方式——使用 quarkus.index-dependency 属性,强制 Quarkus 扫描并索引 test-sdk 模块:
<build><plugins><plugin><groupid>io.quarkus</groupid><artifactid>quarkus-maven-plugin</artifactid><configuration><!-- 方式1:显式索引指定依赖(推荐) --><indexdependencies><indexdependency><groupid>org.example</groupid><artifactid>test-sdk</artifactid></indexdependency></indexdependencies></configuration></plugin></plugins></build>
⚠️ 注意事项:
- indexDependencies 仅对 JAR 依赖有效(即 test-sdk 必须以 jar 形式发布并被引用,而非 project dependency 的 module 引用);
- 若 test-sdk 是多模块 Maven 工程中的子模块,需确保其已 mvn install 并作为独立 JAR 被 test-project 依赖;
- 不要依赖 quarkus-core 或 quarkus-arc 等内部机制自动发现——Quarkus 默认不递归扫描传递性依赖的主类;
- @QuarkusMain 类必须满足:位于 src/main/java、有无参构造、且 main 方法签名正确(public static void main(String[] args)),否则即使索引成功也会启动失败。
? 补充建议:
为提升 SDK 的可嵌入性,可在 test-sdk 的 pom.xml 中预置 quarkus-index-dependency 的 maven-jar-plugin 配置(自动生成 META-INF/quarkus/ 索引元数据),但这仍需消费者端配合启用索引。最可靠、最透明的方案仍是上述 indexDependencies 显式声明。
综上,你的预期完全合理——Quarkus 支持跨模块定义主入口;问题不在设计限制,而在构建配置缺失。只需一条 indexDependencies 配置,即可让 test-project 无缝继承 test-sdk 提供的启动能力,真正实现“使用者无需感知 Quarkus”的 SDK 设计目标。











