5

为什么要将 JAXB 声明为 Java 应用程序的依赖项,因为它无论如何都随 JRE 一起提供并且不能在应用程序类路径中被覆盖?

jersey-json为例,在他们的 POM 文件中,他们声明了对 jaxb-impl 的依赖关系,甚至没有指定确切的版本。他们这样做有什么收获?

而且,当我在自己的 POM 文件中添加对jersey-json的依赖项时,我的类路径中最终会出现 jaxb-api.jar 和 jaxb-impl.jar。我为什么要发生这种情况?如果我不将文件放到认可的库目录中,默认的 JVM 实现不会被加载吗?

4

2 回答 2

1

我在链接的 pom 中看到:

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
    </dependency>

但是还有一个父 pom,因此您可能希望跟踪该跟踪,以查看是否在此处指定了实际版本和/或范围(并向下传播)。

但如果不是,那么我猜 Jersey 团队认为 JAXB 2 API 已经足够成熟,可以让他们指定对 JAXB 实现的松散依赖。

JRE 附带了 JAXB impl 的特定实现,它在最长的时间里等同于 JAXB RI 2.1.7。但与此同时,在您的应用程序中,有一种机制可以轻松地换成您选择的另一种实现。

当然,您可以使用内置的 JRE JAXB 实现,如果它适用于您的应用程序,您肯定应该尝试。

尽管如此,可能导致您需要单独的 JAXB 实现的一些原因包括:遗留错误(在较新版本中已解决);需要更新的 JAXB API,例如 JAXB 2.2.x(在更新的 JRE 版本中提供);想要完全使用不同的实现(因为它恰好具有更好的 API 和/或针对您的特定用途的性能)等...

所以回到你的球衣问题,我再次猜测他们希望让开发人员能够灵活地引入他们选择的 JAXB 实现。我认为他们的指南中的某处有一定程度的建议。但是,JAXB RI 被特别标记为依赖项这一事实削弱了这一论点。

于 2012-06-27T16:24:37.860 回答
0

这听起来像是泽西人错误地定义了他们的依赖。如果您运行的环境提供了依赖项,则应使用“提供”范围定义。

于 2012-06-27T14:43:14.183 回答