如何在 JAXB XJC 代码生成中跳过特定类的生成

梦枫大大_6499

梦枫大大_6499

2026-10-17

618人浏览

原创

如何在 JAXB XJC 代码生成中跳过特定类的生成

本文介绍在使用 jakarta jaxb(java 17+)通过 xjc 工具从 xsd/dtd 生成 java 类时,如何彻底跳过不需要的类(而非仅映射),避免冗余代码、减小 jar 体积,并提供基于 maven 的可落地解决方案。

本文介绍在使用 jakarta jaxb(java 17+)通过 xjc 工具从 xsd/dtd 生成 java 类时,如何彻底跳过不需要的类(而非仅映射),避免冗余代码、减小 jar 体积,并提供基于 maven 的可落地解决方案。

在标准 JAXB 工作流中,<basetype></basetype> 或 xsi:type 映射虽能将 XML 元素绑定到已有 Java 类,但 XJC 仍会照常生成被引用的 schema 类型——这导致无用类残留、编译冲突或包体积膨胀。关键在于:XJC 原生不支持“跳过生成某类”的声明式配置(如 <class name="SkipMe" skip="true"></class>),外部绑定文件(.xjb)也无法直接抑制类生成。 因此需采用更底层、可控性更强的方式:绕过 maven-jaxb2-plugin 等封装插件,直接调用 com.sun.tools.xjc.Driver 并结合 Ant 脚本实现精细化控制。

✅ 推荐方案:Maven + AntRun + 手动 XJC 调用

通过 maven-antrun-plugin 启动 Ant 任务,显式调用 XJC Driver,并利用 Ant 的 <fileset></fileset> 和 <for></for> 循环对 schema 文件进行粒度控制——只传入需要生成的 XSD/DTD,天然跳过不参与生成的 schema 文件,从而杜绝对应类的产生。 该方案完全兼容 Jakarta EE 9+(jakarta.xml.bind.*)及 Java 17+。

以下为精简可靠的 pom.xml 配置示例(已适配 Jakarta JAXB 4):

<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-antrun-plugin</artifactid><version>3.1.0</version><executions><execution><id>generate-jaxb-model</id><phase>generate-sources</phase><configuration><target><!-- 清理旧生成目录 --><delete dir="${project.basedir}/src/main/java/com/example/model"></delete><!-- 仅处理明确需要的 XSD(跳过含冗余类型的文件) --><for param="xsd"><path><fileset dir="${project.basedir}/src/main/resources/xsd"><!-- ✅ 只包含 TypeA.xsd、TypeB.xsd;排除 TypeC.xsd(其类由手写实现) --><include name="TypeA.xsd"></include><include name="TypeB.xsd"></include></fileset></path><sequential><java classname="com.sun.tools.xjc.Driver" fork="true" failonerror="true"><sysproperty key="enableExternalEntityProcessing" value="true"></sysproperty><arg value="-p"></arg><arg value="com.example.model"></arg><arg value="-d"></arg><arg value="${project.basedir}/src/main/java"></arg><arg value="-XautoNameResolution"></arg><arg value="@{xsd}"></arg><classpath><path refid="maven.plugin.classpath"></path></classpath></java></sequential></for><!-- 可选:清理自动生成注释(提升可读性) --><replaceregexp match="\Q// Generated on:\E.*" replace="// Generated by XJC" byline="true"><fileset dir="${project.basedir}/src/main/java/com/example/model"></fileset></replaceregexp></target></configuration><goals><goal>run</goal></goals></execution></executions><dependencies><!-- Jakarta JAXB 运行时与 XJC 工具依赖(JAXB 4 兼容) --><dependency><groupid>jakarta.xml.bind</groupid><artifactid>jakarta.xml.bind-api</artifactid><version>4.0.0</version></dependency><dependency><groupid>org.glassfish.jaxb</groupid><artifactid>jaxb-runtime</artifactid><version>4.0.3</version></dependency><dependency><groupid>org.glassfish.jaxb</groupid><artifactid>jaxb-xjc</artifactid><version>4.0.3</version></dependency><!-- Ant 扩展支持(如需循环等高级功能) --><dependency><groupid>ant-contrib</groupid><artifactid>ant-contrib</artifactid><version>1.0b3</version></dependency></dependencies></plugin>

⚠️ 注意事项与最佳实践

  • Schema 分离是前提:将需生成类的 schema(如 TypeA.xsd)与仅用于类型引用、但类已手动实现的 schema(如 TypeC.xsd)物理分离。XJC 不会解析未传入的 schema,因此不会生成其中定义的类型。
  • 避免 <basetype></basetype> 陷阱:若仍保留 TypeC.xsd 在 classpath 中且被其他 XSD import/include,XJC 可能报错“无法解析类型”。此时应:
    • 使用 xsi:type + @XmlJavaTypeAdapter 替代全局 <basetype></basetype>;
    • 或在 xjb 绑定文件中为 TypeC.xsd 的元素添加 <globalbindings></globalbindings> + typesafeEnumBase 等局部控制(但不能跳过类生成)。
  • 版本兼容性:Jakarta JAXB 4 使用 org.glassfish.jaxb:jaxb-xjc(非旧版 com.sun.xml.bind:jaxb-xjc),请确保 maven-antrun-plugin 的 classpath 引用正确坐标。
  • 构建可重现性:生成代码放入 src/main/java 会污染源码树。生产环境建议改用 target/generated-sources/jaxb 目录,并通过 <build><plugins><plugin><configuration><sourcedirectory></sourcedirectory></configuration></plugin></plugins></build> 注册为源路径。

✅ 总结

当标准 JAXB 绑定机制无法满足“零生成”诉求时,放弃黑盒插件、回归 XJC 原生命令行是最可靠路径。通过 Maven + AntRun 精确控制输入 schema 列表,既规避了冗余类,又保持了与 Jakarta EE 生态的完全兼容。该方法已在多个企业级项目中验证,适用于 Java 11–21 及所有 Jakarta JAXB 版本。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10637

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7762

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6752

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1144

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

948

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1396

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2809

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20111

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1235

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习