在一个maven项目中使用第三方jar的两个版本(带代码冲突)

时间:2016-11-25 13:55:56

标签: java

我们的maven项目包括一个第三个第三个jar,它有两个不同的版本。

  • A-1.0.jar(在版本2中删除了函数A()
  • A-2.0.jar(添加了函数B()(不在版本1中))

如何组织我的代码以同时支持1.0的api和2.0的api?

2 个答案:

答案 0 :(得分:2)

这样做的一种可能方法是不依赖于项目中的库A(不是版本1.0,也不是版本2.0)。

您需要创建另外三个构建(例如maven)项目/工件,它们将是不同库版本的包装器。

您将拥有:

  • AbstractWrapper项目工件
  • 版本1工件的包装
  • 版本2工件的包装器

在AbstractWrapper中,您将拥有一个接口/抽象类,它可以从您要使用的库A重现api。这是将在主项目的依赖项中声明的唯一[3个]工件。这个抽象包装器不依赖于您的项目,也不依赖于lib A

然后每个包装器将依赖于AbstractWrapper(以获取接口定义),并依赖于A库,版本1或版本2.

现在最棘手的问题是让包装器实现(在运行时可用)在主项目中注册。它在很大程度上取决于包装和运行时环境(独立jar,osgi包,servlet规范2.5-,servlet规范3.0 +,springframework ......),我让你对特定环境的插件注册做一些研究。

你可能想到的最简单的事情是Class.forName()尝试你做的两个实现,并使用它找到的第一个(将你得到的类转换为抽象的包装器接口)。

最后,对于使用lib A版本1.0的客户端,您告诉他们依赖于您的主项目和lib版本1的包装,以及主项目和lib版本2上的其他项目。 / p>

答案 1 :(得分:1)

你做不到。但您可以使用以下标记排除一个或另一个版本:

<dependency>
  <groupId>sample.ProjectB</groupId>
  <artifactId>Project-B</artifactId>
  <version>1.0-SNAPSHOT</version>
  <exclusions>
    <exclusion>
      <groupId>sample.ProjectD</groupId> <!-- Exclude Project-D from Project-B -->
      <artifactId>Project-D</artifactId>
    </exclusion>
  </exclusions>
</dependency>

请参阅此处的文档:https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html