解决Java中的传递依赖冲突

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

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

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

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

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

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

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

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

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

从Jar加载器中请求服务合同的实例……

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

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