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

Gradle Ant.xjc报java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlNs求助

问题分析与解决方案

问题根源

java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlNs 出现的核心原因:

  • 你使用的jaxb2-namespace-prefix:1.3是基于旧JAXB(javax.xml.bind命名空间)开发的插件,完全不兼容Jakarta XML Binding 4.x的jakarta.xml.bind命名空间
  • xjc任务的classpath仅配置了插件依赖,未引入Jakarta XML Binding的API与实现,导致插件无法找到对应类(即使generate配置里有相关依赖,xjc任务并未加载)

解决方案

1. 升级兼容Jakarta的JAXB插件版本

将jaxb2-namespace-prefix替换为支持Jakarta的2.0+版本,同时把Jakarta相关依赖加入xjc配置:

dependencies{
    // 原有generate依赖保持不变
    generate("jakarta.xml.bind:jakarta.xml.bind-api:${jakartaVersion}")
    generate("jakarta.xml.ws:jakarta.xml.ws-api:${jakartaVersion}")
    generate("jakarta.activation:jakarta.activation-api:2.1.0")
    generate("com.sun.xml.bind:jaxb-impl:4.0.5")
    generate("com.sun.xml.ws:jaxws-rt:${jaxwsVersion}")
    generate("com.sun.xml.ws:jaxws-tools:${jaxwsVersion}")

    // 替换插件版本并添加Jakarta依赖到xjc配置
    xjc("org.jvnet.jaxb2_commons:jaxb2-namespace-prefix:2.0")
    xjc("jakarta.xml.bind:jakarta.xml.bind-api:${jakartaVersion}")
    xjc("com.sun.xml.bind:jaxb-impl:4.0.5")
}

2. 修正xjc任务的ClassPath配置

在Ant的xjc任务中,合并generate与xjc两个配置的依赖,确保所有必要类都能被加载:

xsdFiles.each { xsd ->
    ant.xjc(destdir: outputs.files.singleFile, schema: "$wsdlDir/$xsd.name", extension: true) {
        binding(dir: "$wsdlDir", includes: commonXsdFiles.get(0))
        binding(dir: "$wsdlDir", includes: commonXsdFiles.get(1))
        binding(dir: "$wsdlDir", includes: xsd.binding)
        // 合并generate和xjc的classpath
        classpath(path: "${configurations.generate.asPath}:${configurations.xjc.asPath}")
        arg(value: '-Xnamespace-prefix')
    }
}

3. 更新绑定文件(.xjb)的命名空间

检查所有.xjb绑定文件,将根元素的旧JAXB命名空间替换为Jakarta版本:
旧命名空间:

xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"

替换为:

xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb"

同时确保jaxb:version属性设置为4.0或兼容版本。

4. 调整XML访问权限属性(可选)

JDK 17+中建议使用Jakarta对应的系统属性:

// 替换原有的javax属性
System.setProperty('jakarta.xml.accessExternalSchema', 'file')

验证修改

执行./gradlew createWsdlSource任务,确认NoClassDefFoundError消失,代码生成正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:33:10