Quarkus 3.2.1.Final原生构建因javax.annotation依赖失败求助
解决Quarkus 3.2.1.Final构建原生镜像时
javax.annotation.Priority未解析的问题 问题根源
Quarkus 3.x基于Jakarta EE 9+规范,使用jakarta.annotation包;而你依赖的moneta-core:1.4.2属于Java EE生态,依赖的是javax.annotation-api。两者包名不兼容,导致GraalVM构建原生镜像时,无法解析org.javamoney.moneta.spi.PriorityAwareServiceProvider中引用的javax.annotation.Priority类型。
可行解决办法
1. 升级moneta-core到Jakarta兼容版本
这是最彻底的解决方案,直接消除javax/jakarta的依赖冲突:
替换pom.xml中的moneta-core依赖为Jakarta迁移后的版本(2.2.0及以上):
<dependency> <groupId>org.javamoney.moneta</groupId> <artifactId>moneta-core</artifactId> <version>2.2.0</version> </dependency>
新版本已完全迁移到Jakarta API,无需额外配置即可适配Quarkus 3.x。
2. 保留旧版moneta-core,通过依赖替换+原生配置兼容
如果无法升级moneta-core,可通过以下步骤处理:
- 排除冲突依赖:在moneta-core依赖中排除
javax.annotation-api:<dependency> <groupId>org.javamoney.moneta</groupId> <artifactId>moneta-core</artifactId> <version>1.4.2</version> <exclusions> <exclusion> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> </exclusion> </exclusions> </dependency> - 引入Jakarta替代依赖:添加Quarkus兼容的Jakarta Annotation API:
<dependency> <groupId>jakarta.annotation</groupId> <artifactId>jakarta.annotation-api</artifactId> <version>2.1.1</version> </dependency> - 配置原生构建规则:在
src/main/resources/application.properties中添加:
或者创建# 注册相关类到GraalVM反射列表 quarkus.native.reflect-config.include=org.javamoney.moneta.spi.PriorityAwareServiceProvider # 强制在构建时初始化Jakarta注解类 quarkus.native.additional-build-args=--initialize-at-build-time=jakarta.annotation.Prioritysrc/main/resources/META-INF/native-image/reflect-config.json文件,更精细地配置反射:[ { "name": "org.javamoney.moneta.spi.PriorityAwareServiceProvider", "allDeclaredConstructors": true, "allPublicMethods": true }, { "name": "jakarta.annotation.Priority", "allPublicConstructors": true } ]
3. 使用Quarkus依赖转换插件自动适配
通过Quarkus Maven插件的依赖转换功能,自动将javax包替换为jakarta包:
在pom.xml的build插件中添加配置:
<plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>3.2.1.Final</version> <executions> <execution> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <dependencyTransformation> <transformations> <transformation> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <targetGroupId>jakarta.annotation</targetGroupId> <targetArtifactId>jakarta.annotation-api</targetArtifactId> <targetVersion>2.1.1</targetVersion> </transformation> </transformations> </dependencyTransformation> </configuration> </plugin>
验证
完成配置后,重新执行原生构建命令:
mvn clean verify -Dnative -Dquarkus.native.container-build=true
内容的提问来源于stack exchange,提问作者Skod
相关产品推荐
相关产品推荐

