Gradle集成Ant配置执行javac时JAXB代码生成异常排查
Gradle JAXB生成Java类后javac编译失败(invalid target release: 11)
问题场景
使用Gradle 4.10.3配置了genJaxb任务从WSDL文件生成Java类,但在执行javac编译环节失败,核心错误提示为invalid target release: 11。
任务配置代码
task genJaxb { ext.sourcesDir = "${buildDir}/generated-sources/jaxb" ext.classesDir = "${buildDir}/classes/jaxb" ext.schemaBnfo = "${projectDir}/src/main/resources/wsdl/1C_BNFO.wsdl" ext.schemaUh = "${projectDir}/src/main/resources/wsdl/1C_UH.wsdl" ext.sourcesBnfoPackage = 'package.integration.onec.ws.model.bnfo' ext.sourcesUhPackage = 'package.integration.onec.ws.model.uh' outputs.dir classesDir doLast() { project.ant { taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask", classpath: configurations.jaxb.asPath mkdir(dir: sourcesDir) mkdir(dir: classesDir) xjc(destdir: sourcesDir, schema: schemaBnfo, package: sourcesBnfoPackage) { arg(value: "-wsdl") } xjc(destdir: sourcesDir, schema: schemaUh, package: sourcesUhPackage) { arg(value: "-wsdl") } javac(destdir: classesDir, source: sourceCompatibility, target: targetCompatibility, debug: true, debugLevel: "lines,vars,source", classpath: configurations.jaxb.asPath) { src(path: sourcesDir) include(name: "**/*.java") include(name: "*.java") } copy(todir: classesDir) { fileset(dir: sourcesDir, erroronmissingdir: false) { exclude(name: "**/*.java") } } } } }
错误日志
> Task :genJaxb FAILED [ant:javac] : warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds [ant:javac] javac: invalid target release: 11 [ant:javac] Usage: javac <options> <source files> [ant:javac] use -help for a list of possible options FAILURE: Build failed with an exception. * Where: Build file 'ourproject\build.gradle' line: 105 * What went wrong: Execution failed for task ':genJaxb'. > Compile failed; see the compiler error output for details. * Try: Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':genJaxb'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:110) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:77) ...(省略堆栈中间部分) Caused by: : Compile failed; see the compiler error output for details. at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1426) at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:1130) ...(省略堆栈中间部分) * Get more help at https://help.gradle.org BUILD FAILED in 0s
问题原因
- Gradle版本兼容性限制:Gradle 4.10.3属于4.x系列,官方仅支持JDK 1.8到JDK 10,不兼容JDK 11。若项目配置的
sourceCompatibility和targetCompatibility为11,而Gradle启动使用的JDK版本低于11,Ant的javac任务会因不支持target 11报错。 - Ant javac任务默认JDK:Ant的javac任务默认使用系统环境变量中的JDK或Gradle进程启动时的JDK,若该JDK版本低于11,无法编译target为11的代码。
解决方案
方案1:降低Java兼容性版本
将项目的sourceCompatibility和targetCompatibility调整为当前JDK支持的版本(比如JDK 8对应1.8),在build.gradle根级别添加:
sourceCompatibility = 1.8 targetCompatibility = 1.8
方案2:升级Gradle版本并适配JDK 11
Gradle 5.0及以上版本支持JDK 11,步骤如下:
- 将Gradle版本升级到5.0+(推荐使用稳定版如5.6.4)
- 确保系统安装了JDK 11,在
gradle.properties中指定JDK路径:org.gradle.java.home=/path/to/jdk11
方案3:为Ant javac任务指定JDK 11路径
在genJaxb任务的javac配置中,直接指定JDK 11的javac可执行文件路径,同时添加includeantruntime: false消除警告:
javac(destdir: classesDir, source: sourceCompatibility, target: targetCompatibility, debug: true, debugLevel: "lines,vars,source", classpath: configurations.jaxb.asPath, executable: "/path/to/jdk11/bin/javac", includeantruntime: false) { src(path: sourcesDir) include(name: "**/*.java") include(name: "*.java") }
内容的提问来源于stack exchange,提问作者Eljah
相关产品推荐
相关产品推荐

