使用OpenJDK11时Ant构建XML中XJC任务抛出InvocationTargetException错误求助
解决OpenJDK11下Ant XJC任务抛出java.lang.Error: java.lang.reflect.InvocationTargetException的问题
从错误栈根因java.lang.NoSuchFieldError: REFLECTION可以判断,这是JAXB版本不兼容或依赖缺失引发的类加载冲突问题,结合OpenJDK11环境特性,给出以下针对性解决方法:
一、降级JAXB版本到兼容OpenJDK11的稳定版
JAXB 4.x属于Jakarta EE 9+规范(包名从javax.xml.bind改为jakarta.xml.bind),而OpenJDK11更适配基于javax.xml.bind的JAXB 2.3.x版本,该版本是Java EE时代的稳定兼容版。
操作步骤:
- 替换现有JAXB依赖为以下版本:
jaxb-api-2.3.1.jar(JAXB核心API)jaxb-xjc-2.3.8.jar(XJC代码生成工具)jaxb-core-2.3.0.jar(JAXB核心工具包)jaxb-impl-2.3.8.jar(JAXB具体实现)istack-commons-runtime-3.0.12.jar(补充反射相关依赖,避免字段缺失)
- 修正Ant的XJC任务类路径配置:
<xjc destdir="${src.java.generated.dir}" package="task.config" readonly="false" removeOldOutput="yes" extension="true"> <classpath> <pathelement location="${libs.dir}/jaxb/jaxb-api-2.3.1.jar"/> <pathelement location="${libs.dir}/jaxb/jaxb-xjc-2.3.8.jar"/> <pathelement location="${libs.dir}/jaxb/jaxb-core-2.3.0.jar"/> <pathelement location="${libs.dir}/jaxb/jaxb-impl-2.3.8.jar"/> <pathelement location="${libs.dir}/jaxb/jaxb-jxc-2.3.8.jar"/> <pathelement location="${libs.dir}/jaxb/istack-commons-runtime-3.0.12.jar"/> </classpath> <schema dir="${config.location}" includes="task.xsd" /> <binding dir="${config.location}" includes="task.xjb" /> <produces dir="${src.java.generated.dir}/task/config" /> <arg value="-no-header" /> </xjc>
二、若坚持使用JAXB 4.x的适配方案
如果必须使用JAXB 4.x,需完成以下调整:
- 将项目中所有JAXB相关代码从
javax.xml.bind迁移到jakarta.xml.bind包名 - 替换Ant内置XJC任务为直接调用JAXB 4.x的命令行工具,避免版本冲突:
<exec executable="${java.home}/bin/java"> <arg value="-cp"/> <arg path="${libs.dir}/jaxb/jakarta.xml.bind-api-4.0.2.jar:${libs.dir}/jaxb/jaxb-xjc-4.0.2.jar:${libs.dir}/jaxb/jaxb-core-4.0.2.jar:${libs.dir}/jaxb/jaxb-impl-4.0.2.jar:${libs.dir}/jaxb/istack-commons-runtime-4.0.2.jar"/> <arg value="com.sun.tools.xjc.XJC"/> <arg value="-d"/> <arg value="${src.java.generated.dir}"/> <arg value="-p"/> <arg value="task.config"/> <arg value="-no-header"/> <arg value="-extension"/> <arg value="${config.location}/task.xsd"/> <arg value="-b"/> <arg value="${config.location}/task.xjb"/> </exec>
错误根源说明
OpenJDK11已完全移除JDK内置的JAXB实现,需手动引入完整依赖包。你之前使用的JAXB 4.x版本与OpenJDK11环境、Ant内置XJC任务存在包名/类结构冲突,导致NavigatorImpl类无法找到REFLECTION字段,最终触发InvocationTargetException。
内容的提问来源于stack exchange,提问作者user4888455
相关产品推荐
相关产品推荐

