我是否可以强制Maven依赖项A使用特定版本的依赖项B,同时使用其他版本的依赖项B?

时间:2018-11-15 08:52:40

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

我有两个Maven项目,可以将它们称为masterauxMaster依赖于aux,也依赖于org.apache.httpcomponents.httpclient的特定版本。 Aux依赖于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使其能够使用相同的依赖关系来进行调和,但这远非理想。

2 个答案:

答案 0 :(得分:2)

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

有一个叫做OSGi的框架可以做到这一点。对于您的应用程序来说,这可能有些矫kill过正,但是如果您想入门,可以看看OSGi enRoute

答案 1 :(得分:0)

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