【问题标题】:java: use two version of the same lib in one webappjava:在一个 webapp 中使用同一个库的两个版本
【发布时间】:2013-07-16 21:59:09
【问题描述】:

我面临以下问题:我的 web 应用程序中有一个模块需要 jaxb 1.x,而另一个模块需要 jaxb 2.x。第一个模块不适用于新版本的 jaxb,反之亦然。如何在一个项目中使用这两个 jar? 谢谢。

【问题讨论】:

  • 你能描述一下“我的 webapp 中的模块”是什么意思吗?例如,它们是独立的 ejb 模块,还是只是共享相同类路径的独立层?另外,你能列出依赖 JAXB jar 的库吗?
  • 您可以将模块视为一个库(它更复杂,但最后我有通过类路径链接到我的 webapp 的 jar 文件)。第一个是 docx4j.jar,第二个是使用 WebService 的第三方助手。我无法更改第三方助手和 docx4j.jar

标签: java jar jaxb version


【解决方案1】:

对于常规应用程序,通常非常不同的版本使用不同的包名称。如果是这种情况,您可以毫无问题地同时使用它们。但是如果它们相同,您可以使用jarjar 重命名包。

但是,由于您使用的是 Web 容器,因此每个应用程序都应该使用您部署的版本,而不是其他版本。即 Web 容器为您解决问题。

OSGi 是另一个容器,它更明确地管理版本并让您更好地控制这些问题(但我相信您只需要它)

【讨论】:

  • 是的,我可以为 jaxb 2.1 jar 重命名包,但我不想这样做。这是因为解决方案有点“脏”。 OSGi 是的,但前提是没有其他解决方案……嗯……重命名似乎越来越合适)
  • 添加了重命名功能。我见过一个包含四个不同版本的 Xerces 的 jar,您可以在运行时选择它们。 :-P
【解决方案2】:

你有一个罐子地狱的问题。一般来说,在正常的java环境中是不可能解决这个问题的。您必须通过使用 OSGI 来强制模块化到您的项目中。起点:http://www.osgi.org/About/HowOSGi

【讨论】:

    【解决方案3】:

    如果您使用的是 JAXB 参考实现,那么您可以通过包含 jaxb1-impl.jar 将 JAXB 1 模型与 JAXB 2 运行时一起使用

    【讨论】:

      【解决方案4】:

      正如萨满所说,解决这个问题是不可能的。

      让我们看看:servlet 容器 JRE 只有一个类加载器,而这个类加载器可以从 jaxb 或另一个加载和使用一个类,但不是两者都会给你一个 classdefnotfound 异常或类似的东西。

      你不能直接解决这个问题: 您可以获取代码(是开源的)并将一个包更改为另一个名称,以便类加载器可以同时使用两者。我不推荐你这个解决方案,是一个糟糕的解决方案。

      更好的是您迁移代码以使用最现代的 API (jaxb 2)

      【讨论】:

      • 不能那样做。因为没有所有的来源。有没有办法自己加载新课程?例如,我将所有逻辑和依赖项放入一个 jar 并加载它的主类。然后我称之为商业方法。如果我这样做会怎样?
      猜你喜欢
      • 1970-01-01
      • 2015-10-31
      • 2018-04-23
      • 1970-01-01
      • 2019-11-18
      • 2023-04-04
      • 2018-04-28
      • 1970-01-01
      • 2012-08-02
      相关资源
      最近更新 更多