我们的 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/