You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus原生构建中JAXB失效:找不到org.glassfish.jaxb.runtime.v2.JAXBContextFactory

解决Quarkus原生构建JAXBContextFactory找不到的问题

问题分析

JVM构建正常但原生构建报错java.util.ServiceConfigurationError: jakarta.xml.bind.JAXBContextFactory: Provider org.glassfish.jaxb.runtime.v2.JAXBContextFactory not found,核心原因是Quarkus原生镜像构建时默认不会自动包含JAXB的服务提供者元数据,同时手动添加的依赖可能和Quarkus自带的传递依赖冲突。

解决步骤

1. 清理依赖,避免版本冲突

quarkus-resteasy-reactive-jaxb已经自带了兼容版本的jaxb-runtime,手动添加的jaxb-runtime可能导致版本不一致或重复依赖,先移除build.gradle里的这一行:

jaxb "org.glassfish.jaxb:jaxb-runtime:4.0.1"

保留jaxb-xjc用于代码生成即可。

2. 配置原生构建包含JAXB服务元数据

需要告诉Quarkus原生构建工具包含JAXB的服务配置文件,有两种方式:

  • 方式一:通过application.properties配置
    在src/main/resources/application.properties中添加:
quarkus.native.additional-build-args=-H:IncludeResources=META-INF/services/jakarta.xml.bind.JAXBContextFactory
  • 方式二:通过Gradle配置
    在build.gradle的quarkus块中添加原生构建参数:
quarkus {
    native {
        additionalBuildArgs.add("-H:IncludeResources=META-INF/services/jakarta.xml.bind.JAXBContextFactory")
    }
}

3. 确保JAXB实体类被原生镜像识别

如果你的项目中有自定义的JAXB实体类(比如用@XmlRootElement注解的类),需要让Quarkus原生构建工具扫描到这些类,有两种方法:

  • 方法一:给实体类加注解
    在每个JAXB实体类上添加@io.quarkus.runtime.annotations.RegisterForReflection注解,确保类被纳入原生镜像的反射元数据。
  • 方法二:用反射配置文件
    创建src/main/resources/reflection-config.json,内容示例:
[
  {
    "name": "com.yourpackage.YourJaxbEntity",
    "allDeclaredConstructors": true,
    "allPublicConstructors": true,
    "allDeclaredMethods": true,
    "allPublicMethods": true,
    "allDeclaredFields": true,
    "allPublicFields": true
  }
]

然后在application.properties中配置:

quarkus.native.reflection-config-files=reflection-config.json

4. 验证依赖版本兼容性

确保quarkus-resteasy-reactive-jaxb的版本和Quarkus核心版本完全一致,同时jaxb-xjc的版本最好和Quarkus传递的jaxb-runtime版本匹配,避免跨版本兼容性问题。

内容的提问来源于stack exchange,提问作者kernelpanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:50:39