为什么生产环境Quarkus应用打包时会包含deployment JAR包
Quarkus生产镜像引入deployment包问题说明与解决方案
核心结论
正常非可变生产模式的Quarkus应用运行时,完全不需要deployment相关JAR包和Maven依赖,你遇到的属于异常的依赖传递引入问题。
引入异常依赖的原因
你使用的Quarkus 2.2.3.Final属于较早的2.x分支版本,存在已知的扩展依赖传递异常问题,会误将扩展的deployment构建包作为compile scope依赖引入到最终构建产物中。少数情况也可能是项目配置错误导致:
- 误将
quarkus-maven-plugin作为普通依赖添加到项目dependencies节点,而非仅在build/plugins中配置 - 打包时指定了
-Dquarkus.package.type=mutable-jar参数,可变包模式默认会打包deployment相关包用于运行时动态调整扩展
deployment包的作用
只有以下场景需要用到deployment包,其余场景都可以安全排除:
- 运行Quarkus开发模式(dev mode),用于实时修改代码、配置后的热增强、热加载
- 使用可变Jar包(mutable-jar)部署,需要在运行时动态调整扩展配置、新增扩展
- 扩展二次开发场景,需要用到扩展的构建态API
deployment包的核心作用是处理扩展的配置解析、类的AOT增强、运行时代理生成、扩展加载逻辑编排,这些逻辑在普通生产构建阶段已经执行完成,运行时完全不需要。
排除方法
你可以按优先级选择以下方案解决:
- 最优方案:升级Quarkus到当前稳定维护版本(2.7.x最新版或3.x版本),这类依赖传递异常问题已经在后续版本中修复
- 手动排除依赖:在引入
quarkus-undertow的依赖配置中增加排除规则,示例如下:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-undertow</artifactId> <exclusions> <exclusion> <groupId>io.quarkus</groupId> <artifactId>quarkus-undertow-deployment</artifactId> </exclusion> <exclusion> <groupId>io.quarkus</groupId> <artifactId>quarkus-core-deployment</artifactId> </exclusion> </exclusions> </dependency>
- 检查打包配置:确认构建命令中没有添加
-Dquarkus.package.type=mutable-jar参数,且quarkus-maven-plugin仅在build/plugins节点下配置,没有作为普通依赖引入
内容的提问来源于stack exchange,提问作者David Currie
相关产品推荐
相关产品推荐

