java - 在一个 Maven 项目中使用第 3 方 jar 的两个版本(存在代码冲突)

标签 java

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

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

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

最佳答案

实现此目的的一种可能方法是在项目中不依赖库 A(不是版本 1.0,也不是版本 2.0)。

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

您将拥有:

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

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

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

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

您能想到的最丑陋的事情是尝试您所做的两种实现,并使用它找到的第一个实现(将您获得的类转换为抽象包装器接口(interface))。

最后,对于使用 1.0 版 lib A 的客户,您告诉他们依赖于您的主项目和 lib 版本 1 的包装器,而其他项目则依赖于您的主项目和 lib 版本2.

关于java - 在一个 Maven 项目中使用第 3 方 jar 的两个版本(存在代码冲突),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40806630/

相关文章:

java - 如何使用Mockito在模拟对象上设置属性?

java - 将按钮中的图标调整为与按钮大小一样大(+使用布局管理器)并使字体与按钮大小一样大

java - 使用 Java API 的无符号整数

java - JPA 等同于 Hibernate org.hibernate.criterion.Example?

java - Matlab:在没有 Matlab 编译器运行时的情况下使用 Java 类

java - 为什么标签不显示在框架中?

java - 如何在运行应用程序期间使用广播接收器监控互联网连接

java - 即使预期结果正确,JUnit 测试也会失败

java - 我需要 Java 和 Javascript 的特定正则表达式模式

java - 静态变量初始化的区别