解决Java中的传递依赖冲突

时间:2015-06-10 22:05:52

标签: java maven gradle maven-shade-plugin

我正在尝试构建一个与HBase通信的Dropwizard(Jersey)REST端点。虽然这些是我唯一的两个顶级依赖项,但这两个依赖项都加载了许多冲突的传递依赖项。这种冲突的一个简单例子是Google的Guava:

  • HBase客户端指定版本11
  • Dropwizard指定18

Dropwizard不适用于版本11,HBase不适用于版本18.

我已经检查了Maven shade插件文档,但它似乎不允许你重新定位依赖jar中的类。所以我不知道如何解决这个问题,而不是将这两个组件分成单独的JVM。

2 个答案:

答案 0 :(得分:1)

这是一个肮脏的解决方案。但你可以......

创建一个项目/模块,您可以在其中定义一组服务接口,dropwizard应用程序将使用这些接口与HBase通信。

创建另一个实现这些接口并使用HBase类的模块/项目。遮蔽这个项目。

在你的Dropwizard项目中只包含接口jar,但是创建一个任务来将着色的工件复制到你的资源中。

为着色的HBase客户端工件创建一个JARClassLoader。您可能必须创建一个不委托父级的特殊子类,因为默认情况下,类加载器会要求父级解析链接,并可能从外部类加载器中提取较新版本的guava。

从Jar loader中询问服务合约的实例......

Businessing api = Class.forName("com.awesome.Businessing", true, jarLoader).newInstance();

答案 1 :(得分:0)

尝试在pom.xml的<dependencyManagement/>部分为这些依赖项指定具体版本。