在我的Maven项目中,我应该使用哪些工件来支持JAXB RI?

53

历史上,在我的Maven项目中,我总是使用以下JAXB RI工件:

  • com.sun.xml.bind:jaxb-impl - 运行时
  • com.sun.xml.bind:jaxb-xjc - 模式编译器
  • com.sun.xml.bind:jaxb-jxc - 模式生成器

自大约版本2.2.10*以来,这些工件现在被描述为“旧的”:

com.sun.xml.bind:jaxb-impl

旧的JAXB运行时模块。

看起来这些工件现在已经过时了。

问题是:

相应地应该使用哪些工件?

2个回答

82

在与 Oracle 澄清后,应使用以下工件:

运行时

如果您想将 XML 反序列化为 Java 对象或将 Java 对象序列化为 XML:

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>...</version>
</dependency>

Schema编译器(XJC)

如果您拥有一个XML Schema并希望生成相应的Java代码:

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-xjc</artifactId>
    <version>...</version>
</dependency>

模式生成器 (JXC/schemagen)

如果您有带有JAXB注释的Java类并且想要基于它们生成XML模式:


<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-jxc</artifactId>
    <version>...</version>
</dependency>

两个后续的构件 (org.glassfish.jaxb:jaxb-xjc and org.glassfish.jaxb:jaxb-jxc)由Maven插件包装,因此在运行时通常不需要它们。

Eclipse使用方法

如果你的Maven项目无法获取完整的类路径,请打开调试输出并查看Maven控制台。您可能会在那里看到以下错误信息:

[ERROR] 'dependencyManagement.dependencies.dependency.systemPath' for com.sun:tools:jar must specify an absolute path but is ${tools.jar} @

这是由以下问题导致的:

Maven没有正确选择JAVA_HOME

@rustyx提供的解决方案是将-vm选项添加到eclipse.ini中:

-vm
<PATH_TO_JDK>\jre\bin\javaw.exe

运行时捆绑包引用就是我在寻找的。完美地工作了。我们不必包含com.sun.xml.bind:jaxb-impl。 - raksja
3
我发现了有关制造模式和编译模式的工具的artifacts org.glassfish.jaxb:jaxb-jxc和org.glassfish.jaxb:jaxb-xjc的提及。缺失的是如何使用这些工件来实际调用这些工具,对于Java 11来说尤其重要。如果有一个使用Gradle的例子就更好了。 - swpalmer
@swpalmer 这超出了这个问题的范围。请提出一个单独的问题。 - lexicore
@lexicore 谢谢,我已经在 https://dev59.com/763la4cB1Zd3GeqPHRvE 上提问了。 - swpalmer
3
为了在REST服务响应中将Java对象转换为XML,我还需要添加以下依赖项: javax.activation activation 1.1.1 - Anddo

1
最新的JAXB 2版本是2.3.3,根据Eclipse Implementation of JAXB,以下是Eclipse实现JAXB工件的Maven坐标:
<!-- API classes for Jakarta XML Binding. Required to compile against Jakarta XML Binding. -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.3</version>
</dependency>

<!-- Contains the main runtime used for serialization and deserialization java objects to/from xml. -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.6</version>
</dependency>

<!-- Tool to generate Jakarta XML Binding java sources from XML representation. -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-xjc</artifactId>
    <version>2.3.6</version>
</dependency>

<!-- Tool to generate XML schema from Jakarta XML Binding java sources. -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-jxc</artifactId>
    <version>2.3.6</version>
</dependency>

此处的文档说:

一般来说,应该使用 com.sun.xml.bind 的构件。

它们在 Maven 中的坐标为:
<!-- API classes for Jakarta XML Binding. Required to compile against Jakarta XML Binding. -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.3</version>
</dependency>

<!-- RI Implementation of JAXB runtime jar. -->
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.6</version>
</dependency>

<!-- Class generation tool jar. -->
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-xjc</artifactId>
    <version>2.3.6</version>
</dependency>

<!-- Schema generation tool jar. -->
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-jxc</artifactId>
    <version>2.3.6</version>
</dependency>

编辑:JAXB版本2.3.3的文档已经被删除。这里是JAXB 2.3.7相同部分的链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接