【问题标题】:Resolving transitive dependency conflicts in Java解决 Java 中的传递依赖冲突
【发布时间】:2015-08-26 09:37:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您能否详细说明为什么每个都不能使用升级/降级版本的番石榴运行?
  • 冲突有很多,但最让我头疼的是com.google.common.base.Stopwatch,在版本 17 和 18 之间,API 发生了变化,没有任何形式的弃用
  • 没有机会 fork HBase 和升级依赖?
  • 我发现这篇文章非常有用elastic.co/blog/to-shade-or-not-to-shade。想在这里发帖很久了

标签: java maven gradle maven-shade-plugin


【解决方案1】:

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

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

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

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

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

向 Jar loader 请求服务契约的实例...

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2016-02-26
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多