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
相关产品推荐
相关产品推荐

