我们的maven项目包括一个第三个第三个jar,它有两个不同的版本。
A()
)B()
(不在版本1中))如何组织我的代码以同时支持1.0的api和2.0的api?
答案 0 :(得分:2)
这样做的一种可能方法是不依赖于项目中的库A(不是版本1.0,也不是版本2.0)。
您需要创建另外三个构建(例如maven)项目/工件,它们将是不同库版本的包装器。
您将拥有:
在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