【问题标题】:How to fix dependency version conflicts?如何解决依赖版本冲突?
【发布时间】:2014-03-30 09:02:16
【问题描述】:

我有 2 个不同的模块 A 和 B。我还有另一个模块 C。

A 使用 C 版本 1.0

B 使用 C 版本 2.0

问题是因为 C 2.0 不向后兼容,即使 C 1.0 和 C 2.0 的 groupId 和 artifactId 值相同,我不能在我的 pom.xml 中排除其中一个并将另一个用于 A 和B. 因此排除标签在这种情况下不起作用。我需要向特定模块注入依赖项。

我发现我可以将 OSGI 用于此目的,但我无法使其工作。如果您有任何 OSGI 教程或其他解决方案,那就太好了。

【问题讨论】:

  • OSGi 在这种情况下是一个巨大的大锤来破解橡子。只需排除依赖项并包含您想要的特定版本。
  • @BoristheSpider 有没有办法在一个项目中使用两个不同版本的包?包 A 只是一个 jar 包,我不能(不应该)修改它。另一方面,C 2.0 支持我需要在包 B 中使用的新功能。
  • 你知道使用不同的类加载器

标签: java maven intellij-idea apache-felix maven-bundle-plugin


【解决方案1】:

如果不使用 OSGI,则可以选择重构应用程序以便在单独的 WAR 文件上运行 A 和 B,如果这是在 Web 应用程序服务器中运行的情况。

这种方式WAR 1 包含A 和C 1.0,WAR 2 包含B 和C 2.0,在这种情况下没有干扰。

【讨论】:

  • 这是一个经典的 Java 应用程序,而不是一个 Web 应用程序。 AFAIK WAR 选项仅适用于 servlet。
  • 那么如果可能的话,另一种选择是将其拆分为两个单独的应用程序,否则最好从 OSGI 容器中运行,其中应用程序是两个依赖于不同包版本的 C 的包. 如果捆绑包不可用,您将需要自己安装捆绑包 C。看看 Apache Karaf 轻量级 OSGI 容器karaf.apache.org
【解决方案2】:

在项目 A 和/或 B 上尝试 Maven Shade pluginrelocation。这会将 C 的类包含到您的项目中。而且由于 C 获得了不同的包路径,因此不会再有任何类冲突。

【讨论】:

    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 2021-03-07
    • 2018-11-01
    • 1970-01-01
    • 2014-08-15
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多