You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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自带工具的限制:

  1. 先下载JAXB相关的jar包(比如jaxb-api、jaxb-core、jaxb-xjc、jaxb-impl),放到项目的lib目录下
  2. 在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>
  1. 重新定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:12:26