多模块Quarkus项目Dev模式启动失败:DevModeContext.getApplicationRoot()为空
Quarkus多模块项目Dev模式启动NullPointerException问题解决
问题描述
项目升级至Quarkus 2.14.1 Final版本(曾使用2.13.3 Final、2.13.4.Final),切换为多模块结构后可正常构建,但执行quarkus dev启动Dev模式时触发以下报错:
[INFO] --- quarkus-maven-plugin:2.14.1.Final:dev (default-cli) @ my-project --- Listening for transport dt_socket at address: 5005 Exception in thread "main" java.lang.NullPointerException: Cannot invoke "io.quarkus.deployment.dev.DevModeContext$ModuleInfo.getMain()" because the return value of "io.quarkus.deployment.dev.DevModeContext.getApplicationRoot()" is null at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:90) at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62)
复现步骤
- 执行命令生成基础项目:
quarkus create app --maven --java=19.0.1 --wrapper --package-name=com.myproject - 添加新子模块(如
infrastructure-web) - 将生成的
com.myproject.GreetingResource源码迁移至新模块的src/main/java目录下 - 执行
mvn clean install && quarkus dev,触发报错
问题原因
Quarkus Dev模式默认会在当前执行命令的模块中查找应用入口、部署资源等核心内容。当所有业务代码移至子模块后,根模块不再包含Quarkus应用的必要组件,导致Dev模式无法定位到应用根目录,进而抛出NullPointerException。
解决方案
方案1:指定Dev模式运行的子模块
执行quarkus dev时,通过参数指定包含Quarkus应用代码的子模块:
mvn clean install && quarkus dev -Dquarkus.dev.module=infrastructure-web
或者直接进入子模块目录执行命令:
cd infrastructure-web quarkus dev
方案2:通过Maven命令指定子模块运行
若根模块为聚合模块,可通过Maven的-pl(指定模块)和-am(同时构建依赖模块)参数启动Dev模式:
mvn quarkus:dev -pl infrastructure-web -am
内容的提问来源于stack exchange,提问作者Eduardo Yáñez Parareda
相关产品推荐
相关产品推荐

