Java 9环境下如何修改ANT build.xml中的xjc块以正常生成类?
解决Java 9下xjc在build.xml中工作异常的方案
这问题我之前帮不少开发者踩过坑——Java 9引入模块化系统后,JAXB(包括xjc工具)不再是JDK的默认内置组件了,这直接导致原来在Java 8里正常的build.xml脚本出问题。咱们分两种场景来调整:
场景1:继续使用JDK自带的xjc(仅适用于Java 9/10)
如果只是临时过渡到Java 9/10,不想引入额外依赖,可以给xjc任务添加模块参数,强制加载JAXB相关模块:
修改build.xml里的xjc任务,加入jvmarg参数:
<xjc schema="你的schema文件路径" destdir="生成类的目标目录"> <!-- 强制加载Java 9中模块化的JAXB组件 --> <jvmarg value="--add-modules=java.xml.bind"/> <!-- 如果还有其他依赖模块,比如javax.activation,可以一起加上 --> <!-- <jvmarg value="--add-modules=java.xml.bind,java.activation"/> --> </xjc>
这样调整后,JDK自带的xjc就能正常识别并处理schema,不会再出现生成文件缺失的情况。
场景2:切换到独立的JAXB xjc工具(推荐长期兼容Java 9+)
Java 11及以后的版本完全移除了JAXB组件,所以更稳妥的方式是改用独立的JAXB依赖包,彻底脱离JDK自带工具的限制:
- 先下载JAXB相关的jar包(比如jaxb-api、jaxb-core、jaxb-xjc、jaxb-impl),放到项目的
lib目录下 - 在build.xml中定义JAXB的类路径:
<path id="jaxb.classpath"> <fileset dir="lib"> <include name="jaxb-api-*.jar"/> <include name="jaxb-core-*.jar"/> <include name="jaxb-xjc-*.jar"/> <include name="jaxb-impl-*.jar"/> <!-- 如果需要处理其他XML特性,比如javax.activation,也要加上对应的jar --> </fileset> </path>
- 重新定义xjc任务,指定使用独立的XJCTask类:
<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask"> <classpath refid="jaxb.classpath"/> </taskdef> <!-- 调用调整后的xjc任务 --> <xjc schema="你的schema文件路径" destdir="生成类的目标目录" classpathref="jaxb.classpath"> <!-- 如果有自定义绑定文件,记得加上 --> <!-- <binding dir="bindings" includes="*.xjb"/> --> </xjc>
额外检查点
如果还是出现文件缺失,大概率是Java 9的xjc默认行为有细微变化:
- 确认你的schema文件是否有导入其他外部schema,确保这些文件路径正确
- 检查自定义绑定文件(*.xjb)的规则,Java 9对绑定规则的兼容性有小幅度调整,比如某些注解的生成逻辑
内容的提问来源于stack exchange,提问作者mat7e
相关产品推荐
相关产品推荐

