【问题标题】:Can I force a maven dependency A to use a specific version of a dependency B, whilst using a different version of dependency B along-side it?我可以强制 maven 依赖项 A 使用特定版本的依赖项 B,同时使用不同版本的依赖项 B 吗?
【发布时间】:2019-04-18 07:50:51
【问题描述】:

我有两个 maven 项目,我们称它们为 masterauxMaster 依赖于 aux,也依赖于特定版本的 org.apache.httpcomponents.httpclientAux 依赖于更高版本的 org.apache.httpcomponents.httpclient

例如

<project...>
  <artifactId>master</artifactId>
  <groupId>com.my-company</groupId>

  <dependencies>

    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>earlier version</version>
    </dependency>

    <!--<uses later version of http client>-->
    <dependency>
      <groupId>com.my-company</groupId>
      <artifactId>aux</artifactId>
    </dependency>

    ...
  </dependencies>
  ...
</project>

但是,aux 依赖于仅在较新版本的httpclient 中找到的类,并且masterhttpclient 的依赖不向前兼容,因此无论我排除哪个版本,REST 调用都会在预期地点。

有没有办法要求 aux 使用较新的依赖项,而 master 使用较旧的依赖项?

我知道我可以通过修补 auxmaster 来协调它们以使用相同的依赖项,但这远非理想。

【问题讨论】:

标签: java maven dependencies pom.xml diamond-problem


【解决方案1】:

您可以编写自定义类加载器来加载指定版本的类,因为默认类加载器只会选择它可以找到的类路径中的第一个。

【讨论】:

    【解决方案2】:

    您不能在类路径上同时拥有同一个库/类的多个版本。您必须将 'master' 和 'aux' 分离到单独的 jar 中,嵌入所需版本的 httpclient,并使用自己的类加载器加载每个 jar。

    有一个名为 OSGi 的框架可以做到这一点。这对你的应用程序来说可能有点矫枉过正,但如果你想开始,你可以看看OSGi enRoute

    【讨论】:

    • OSGi 绝对比尝试管理自己的类加载器图更简单!
    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2016-07-29
    相关资源
    最近更新 更多