jaxb2-basics与com.intershop.gradle.jaxb 6.0.0兼容报错问题
问题场景
使用Gradle 8.1.1搭配com.intershop.gradle.jaxb 6.0.0版本,基于Java 17从WSDL生成Java类,需要借助jaxb2-basics扩展来使用-XtoString参数生成带toString方法的类。但在依赖中添加jaxbext 'org.jvnet.jaxb2_commons:jaxb2-basics:1.11.1'后,哪怕没加-XtoString参数,执行xjc任务时也直接失败。注释掉该依赖后,生成任务能正常运行。现在需要解决这个兼容性问题,让jaxb2-basics能正常工作,同时可以通过-XtoString参数生成符合要求的Java类。
原项目配置如下:
plugins { id "java" id 'com.intershop.gradle.jaxb' version '6.0.0' } sourceSets { main { java { srcDir "${project.buildDir}/generated-java/csClientWs" } } } repositories { mavenCentral() } ext { testV = '4.7.472.60' } dependencies { implementation 'com.sun.xml.bind:jaxb-xjc:4.0.2' implementation 'com.sun.xml.bind:jaxb-jxc:4.0.2' implementation 'com.sun.xml.bind:jaxb-impl:4.0.2' implementation 'com.sun.xml.bind:jaxb-core:4.0.2' implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.2' implementation 'jakarta.xml.bind:jakarta.xml.bind-api:3.0.1' implementation 'jakarta.activation:jakarta.activation-api:2.1.0' jaxbext 'javax.xml.bind:jaxb-api:2.4.0-b180830.0359' jaxbext 'net.java.dev.jaxb2-commons:jaxb-fluent-api:2.1.8' jaxbext 'com.github.jaxb-xew-plugin:jaxb-xew-plugin:2.1' //jaxbext 'org.jvnet.jaxb2_commons:jaxb2-basics:1.11.1' //implementation 'org.jvnet.jaxb2_commons:jaxb2-basics-ant:1.11.1' //implementation 'org.jvnet.jaxb2_commons:jaxb2-basics-runtime:1.11.1' //implementation 'org.jvnet.jaxb2_commons:jaxb2-basics:1.11.1' //implementation 'org.jvnet.jaxb2_commons:jaxb2-basics-annotate:1.1.0' } jaxb { javaGen { csClientWs { strictValidation = false extension = true packageName = 'org.excample.csclient.ws' header = true schema = file("${projectDir}/src/main/wsdl/test_${testV}.wsdl") binding = file("${projectDir}/src/main/wsdl/binding.xjb") args = ['-wsdl', '-Xxew', '-Xfluent-api'] } } }
解决步骤
- 版本适配:jaxb2-basics 1.11.1是为JAXB 2.x(javax命名空间)设计的,而当前项目使用的是JAXB 4.x(Jakarta EE 9+,jakarta命名空间),版本不匹配导致冲突。需要改用支持Jakarta的jaxb2-basics版本。
- 更新依赖配置:
- 替换jaxbext中的jaxb2-basics为兼容Jakarta的版本:
jaxbext 'org.jvnet.jaxb2_commons:jaxb2-basics:2.0.4' - 添加对应的runtime依赖到implementation:
implementation 'org.jvnet.jaxb2_commons:jaxb2-basics-runtime:2.0.4' - 移除旧的
javax.xml.bind:jaxb-api依赖,避免与Jakarta API冲突
- 替换jaxbext中的jaxb2-basics为兼容Jakarta的版本:
- 启用-XtoString参数:在jaxb任务的args中添加
-XtoString
修改后的完整配置:
plugins { id "java" id 'com.intershop.gradle.jaxb' version '6.0.0' } sourceSets { main { java { srcDir "${project.buildDir}/generated-java/csClientWs" } } } repositories { mavenCentral() } ext { testV = '4.7.472.60' } dependencies { implementation 'com.sun.xml.bind:jaxb-xjc:4.0.2' implementation 'com.sun.xml.bind:jaxb-jxc:4.0.2' implementation 'com.sun.xml.bind:jaxb-impl:4.0.2' implementation 'com.sun.xml.bind:jaxb-core:4.0.2' implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.2' implementation 'jakarta.xml.bind:jakarta.xml.bind-api:3.0.1' implementation 'jakarta.activation:jakarta.activation-api:2.1.0' // 添加jaxb2-basics runtime依赖 implementation 'org.jvnet.jaxb2_commons:jaxb2-basics-runtime:2.0.4' // 移除旧的javax JAXB API依赖,避免冲突 // jaxbext 'javax.xml.bind:jaxb-api:2.4.0-b180830.0359' jaxbext 'net.java.dev.jaxb2-commons:jaxb-fluent-api:2.1.8' jaxbext 'com.github.jaxb-xew-plugin:jaxb-xew-plugin:2.1' // 使用兼容Jakarta的jaxb2-basics版本 jaxbext 'org.jvnet.jaxb2_commons:jaxb2-basics:2.0.4' } jaxb { javaGen { csClientWs { strictValidation = false extension = true packageName = 'org.excample.csclient.ws' header = true schema = file("${projectDir}/src/main/wsdl/test_${testV}.wsdl") binding = file("${projectDir}/src/main/wsdl/binding.xjb") // 添加-XtoString参数 args = ['-wsdl', '-Xxew', '-Xfluent-api', '-XtoString'] } } }
验证
执行gradle generateJaxb任务,此时应该能正常生成带toString方法的Java类,且无任务失败报错。
内容的提问来源于stack exchange,提问作者Dmitry Roginin
相关产品推荐
相关产品推荐

