我有两个Maven项目,可以将它们称为master
和aux
。 Master
依赖于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
的较新版本中找到的类,并且master
对httpclient
的依赖关系不向前兼容,因此无论哪个版本我排除了,REST调用在预期的位置失败。
是否有一种方法要求aux
使用较新的依赖项,并要求master
使用较旧的依赖项?
我知道我可以通过修补aux
和master
使其能够使用相同的依赖关系来进行调和,但这远非理想。
答案 0 :(得分:2)
您不能同时在类路径上具有相同库/类的多个版本。您将必须将'master'和'aux'分离到单独的jar中,嵌入所需的httpclient
版本,并使用自己的类加载器加载每个jar。
有一个叫做OSGi的框架可以做到这一点。对于您的应用程序来说,这可能有些矫kill过正,但是如果您想入门,可以看看OSGi enRoute。
答案 1 :(得分:0)
您可以编写一个自定义的类加载器来加载指定版本的类,因为默认的类加载器只会在它可以找到的类路径上选择第一个。