Gradle中用JAXB2 Basics插件生成带toString的类遇-XtoString参数错误
解决JAXB2 Basics -XtoString参数不被Gradle XJC任务识别的问题
问题原因
- 插件未加入XJC执行classpath:你当前仅将jaxb2-basics依赖放在
implementation配置中,但XJC任务(通过Ant调用)使用的是annotationProcessor配置的classpath,其中只包含jaxb-xjc,并未包含jaxb2-basics的XJC插件,导致XJC无法识别-XtoString参数。 - 版本兼容问题:你使用的是Jakarta EE 4版本的JAXB(
jakarta.xml.bind-api:4.0.0),而旧版jaxb2-basics:0.13.1是针对传统Java EE的javax.xml.bind规范,无法适配Jakarta的包名变更,必须使用适配Jakarta的jaxb2-basics版本。 - 额外说明:
-Xlocator是JAXB原生支持的扩展参数,无需额外插件,所以能正常工作。
解决方案
方案一:使用已引入的unbroken-dome xjc插件(推荐)
你已经添加了org.unbroken-dome.xjc插件,直接用它配置XJC任务更简洁,且自动处理classpath和依赖:
plugins { id 'java' id 'org.unbroken-dome.xjc' version '2.0.0' } group = 'com.example' version = '1.0.0' java { toolchain { languageVersion.set(JavaLanguageVersion.of(21)) } } repositories { mavenCentral() } dependencies { // Jakarta XML Bind API implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0' implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.2' // JAXB2 Basics 适配Jakarta的版本 xjc 'org.jvnet.jaxb2_commons:jaxb2-basics-jakarta:1.1.1' xjc 'org.jvnet.jaxb2_commons:jaxb2-basics-tools-jakarta:1.1.1' implementation 'org.jvnet.jaxb2_commons:jaxb2-basics-runtime-jakarta:1.1.1' } // 配置unbroken-dome的XJC任务 xjc { sourceDir = file('src/main/resources/xsd') outputDir = file("$buildDir/generated-sources/xjc") packageName = 'com.example.generated' // 添加需要的扩展参数 args = ['-XtoString', '-Xlocator'] extension = true }
删除你自定义的generateBeans任务即可,org.unbroken-dome.xjc插件会自动生成xjc任务,且该任务会被自动添加到compileJava任务的依赖中,编译时自动生成代码。
方案二:修复自定义Ant XJC任务
如果坚持使用自定义Ant任务,需调整classpath和依赖版本:
plugins { id 'java' } group = 'com.example' version = '1.0.0' java { toolchain { languageVersion.set(JavaLanguageVersion.of(21)) } } repositories { mavenCentral() } // 新增XJC专用配置 configurations { xjc } dependencies { // Jakarta XML Bind API implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0' implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.2' // XJC及插件依赖加入专用配置 xjc 'org.glassfish.jaxb:jaxb-xjc:4.0.2' xjc 'org.jvnet.jaxb2_commons:jaxb2-basics-jakarta:1.1.1' xjc 'org.jvnet.jaxb2_commons:jaxb2-basics-tools-jakarta:1.1.1' implementation 'org.jvnet.jaxb2_commons:jaxb2-basics-runtime-jakarta:1.1.1' } def schemaDir = file("src/main/resources/xsd") def outputDir = file("$buildDir/generated-sources/xjc") task generateBeans { group = "code generation" description = "Generates Java Beans from XSD schemas" doFirst { delete outputDir mkdir outputDir } doLast { // 使用xjc配置的classpath,包含jaxb2-basics插件 ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask', classpath: configurations.xjc.asPath) fileTree(schemaDir).matching { include '**/*.xsd' }.files.each { xsdFile -> logger.lifecycle("Generating Java classes for schema: ${xsdFile}") def targetPackage = 'com.example.generated' ant.xjc(destdir: outputDir, package: targetPackage, extension: true) { schema(file: xsdFile) arg(value: '-XtoString') arg(value: '-Xlocator') } } } } // 将generateBeans任务添加到编译依赖 compileJava.dependsOn generateBeans // 让Gradle识别生成的代码目录 sourceSets.main.java.srcDirs += outputDir
验证
执行./gradlew compileJava(Windows环境执行gradlew compileJava),生成的Java Bean类中会包含自动生成的toString()方法,且不再出现unknown parameter -XtoString错误。
内容的提问来源于stack exchange,提问作者tpa
相关产品推荐
相关产品推荐

