解决Java中的传递依赖冲突

Dmi*_*sky 6 java gradle maven maven-shade-plugin

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

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

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

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

Ste*_*rla 1

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

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

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

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

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

向 Jar 加载程序索要服务合同的实例...

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