【问题标题】:How to get maven to use a different JAXB library to one in JDK如何让 Maven 在 JDK 中使用不同的 JAXB 库
【发布时间】:2011-12-11 22:14:10
【问题描述】:

我正在使用 java 1.6.0_14,其中包含注释 javax.xml.bind.annotation.XmlElement 的实现。但是 JDK 中的那个只适用于 Method 和 Field。

我发现 jaxb-api.jar 版本 2.2.3 也允许在 Parameter 上这样做,所以我想使用这个版本。

问题是,我不知道如何让 maven 优先使用这个而不是 JDK 中的那个,这样当我编写代码时,它就不会抱怨注释被用于无效位置。

有什么建议吗?

【问题讨论】:

  • 您应该能够通过在 pom.xml 中显式添加对它的依赖项将 jaxb-api.jar 放在类路径中的前面。如果你没有使用 maven 来运行应用程序,那么你必须确保新库在旧库之前的类路径中可用。
  • 你试过Java 6 update 27吗? (更新 14 已经很老了)
  • @Peter Lawrey。谢谢你,但用​​于 xmlelement 的 Java 6 javadoc 显示它仅适用于 FIELD 和 METHOD。另一方面,Java 7 也允许在 PARAMETER 上使用它——但我不能证明升级到 v7 来解决这个问题是合理的。
  • 抱歉,最新的 Java 6 是更新 29。您可以将库添加到 jre/lib/endorsed 目录(您必须添加)。此目录中的任何内容都优先于 JRE 中的内容使用。 (如果你愿意,甚至是 java.lang.Object ;)
  • @Peter 我在 Nicola 给出的答案中概述了认可的目录有效,但我们决定暂时放弃它,等到我们在项目中升级 java。还是谢谢你。

标签: java xml maven jaxb


【解决方案1】:

您必须使用 Java 认可的覆盖机制。我是直接从 Apache CXF 网站获得的。

JAXB 是 CXF 的默认数据绑定。如果您没有在 Spring 配置中或通过 API 指定其他数据绑定之一,您将获得 JAXB。自 2.3.x 以来的 CXF 版本使用 JDK7 默认的 JAXB 2.2,但是在 JDK 6 上运行的 Maven 用户将需要使用 Java 认可的覆盖机制来使用 JAXB 2.2 而不是 JAXB 2.1。

http://cxf.apache.org/docs/jaxb.html 顶部的第一段。您基本上下载了新版本的 jaxb,然后告诉 JRE/JDK 加载它而不是它附带的默认实现。

【讨论】:

    【解决方案2】:

    在您的 POM 中包含显式依赖项:

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.2.3</version>
    </dependency>
    

    【讨论】:

    • 谢谢,但这不是问题 - jar 在我的 maven 依赖项中(我可以看到),但它出现在类路径中的顺序是问题所在。因此,在 Eclipse 中,我可以重新排序 jar 和 JDK(项目 > 属性 > java 构建路径 > 订购和导出选项卡)并且一切正常 - 但是如何使用 maven 来做到这一点?
    • 我很困惑。我们明确地使用 jaxb-api 2.1,但我认为除了将其添加到 POM 之外,我们没有做任何特别的事情。我们确实拥有的另一个与 jaxb 相关的设置是针对 maven-jaxb-plugin 的,但我想说,这应该只与代码生成相关。
    • 不,无论我将依赖项放在哪里,仍然首先找到 JDK - 你使用的是 java 1.6 吗?我发现其他人 ([link]stackoverflow.com/questions/7654628/…) 也有类似的问题,他们的解决方法是添加到编译器构建路径。这解决了问题(命令行构建现在完成)但感觉不对,无论如何 eclipse 仍然不知道依赖顺序。
    • 我确实在使用 Java 1.6。我将编译器插件显式配置为强制将 1.6 作为源版本和目标版本。您可以尝试的一件事是利用 endorsed 机制来强制识别您的 jaxb-api 版本。
    • 谢谢。我将 jar 复制到背书目录中,这确实解决了问题,eclipse 将其拾取,一切看起来都很好......但是,我们决定不这样做(管理问题,我们必须手动复制它到处都是新的 jar,包括构建服务器等),然后等到我们升级到 java 7,无论何时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多