解决Java中的可传递依赖冲突

解决Java中的可传递依赖冲突,java,maven,gradle,maven-shade-plugin,Java,Maven,Gradle,Maven Shade Plugin,我正在尝试构建一个与HBase通信的(Jersey)REST端点。尽管这是我仅有的两个顶级依赖项,但这两个依赖项都带有许多冲突的可传递依赖项。谷歌的番石榴就是这种冲突的一个简单例子: HBase客户端指定版本11 Dropwizard指定18 Dropwizard不适用于版本11,HBase不适用于版本18 我已经检查了Maven shade插件文档,但它似乎不允许您重新定位依赖项jar中的类。因此,除了将这两个组件分离到单独的JVM之外,我不知道如何解决这个问题。这是一个肮脏的解决方案。但

我正在尝试构建一个与HBase通信的(Jersey)REST端点。尽管这是我仅有的两个顶级依赖项,但这两个依赖项都带有许多冲突的可传递依赖项。谷歌的番石榴就是这种冲突的一个简单例子:

  • HBase客户端指定版本11
  • Dropwizard指定18
Dropwizard不适用于版本11,HBase不适用于版本18

我已经检查了Maven shade插件文档,但它似乎不允许您重新定位依赖项jar中的类。因此,除了将这两个组件分离到单独的JVM之外,我不知道如何解决这个问题。

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

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

创建实现这些接口并使用HBase类的另一个模块/项目。给这个项目加上阴影

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

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

从Jar加载器请求服务契约的实例


businessingapi=Class.forName(“com.awesome.Businessing”,true,jarLoader).newInstance()

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

您能否提供更多详细信息,说明为什么不能使用升级/降级版本的guava运行每个依赖项?冲突很多,但让我丧命的是
com.google.common.base.Stopwatch
,在版本17和版本18之间,API在没有任何形式的弃用的情况下发生了什么变化?没有机会分叉HBase并升级依赖关系?我发现本文非常有用。很久以来我一直想在这里发帖