在 Java 11 中使用 Apache cxf-xjc-plugin 效果很好,我能够从 xsd 文件生成 Java 源。当尝试将这些 Java 类与 JAXB 一起使用时,问题就出现了:Java 11 的 JAXB 的可用实现是
org.glassfish.jaxb:jaxb-runtime
或 org.eclipse.persistence:org.eclipse.persistence.moxy
,它们都将包 javax.xml.bind
中的所有类移动到 jakarta.xml.bind
。这是一个问题,因为 cxf-xjc-plugin 生成的 Java 类是使用包中的注释进行注释的 javax.xml.bind
。
我脑海中存在两种可能的解决方案:
javax.xml.bind
包的 JAXB(针对 Java 11)的实现?jakarta.xml.bind
来生成类注释?您可以在生成的文件中使用
maven-antrun-plugin
将 javax.xml.bind
替换为 jakarta.xml.bind
:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>fix-sources</id>
<phase>process-sources</phase>
<configuration>
<target>
<replace token="javax.xml.bind." value="jakarta.xml.bind."dir="${project.build.directory}/generated/src/main/java/path/to/sources">
<include name="**/*.java"/>
</replace>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
这个独立的 Maven 项目下载 (zip) 演示了如何在 Java 11+ 中使用由 cxf-xjc-plugin 生成的类。它使用 cxf-xjc-plugin v4.0.1 使用来自
jakarta.xml.bind.annotation
的注释来注释生成的 Java 类。该演示包括 (a) 单元测试和 (b) 使用 JAXB 解组和编组示例 XML 文件的简单应用程序。