【问题标题】:Maven subdependency conflict at runtime with TwilioMaven 在运行时与 Twilio 的子依赖冲突
【发布时间】:2019-08-11 16:13:25
【问题描述】:

由于 maven 子依赖问题,在运行时出现找不到类的错误:

我正在将 twilio sdk (com.twilio.sdk:twilio:7.35.0) 集成到一个多模块 maven(3.x)/java(java8) 项目中。 我首先将twilio maven依赖添加到相应的模块中 我在 org.apache.http.conn.HttpClientConnectionManager 上运行时遇到类未找到异常。 我调查了一下,发现这个类是 org.apache.httpcomponents:httpclient (这是 twilio sdk 中的一个子依赖项)的一部分,并且这个依赖项的早期版本在我的项目中。 而且这个早期版本没有 HttpClientConnectionManager 类。

因此,从这一点开始,我尝试先使用排除标记排除旧版本的依赖项,然后使用 maven enforcer 插件,同时直接导入依赖项,但没有任何效果。 我尝试在父 pom 和其他使用我的 twilio 模块的模块中导入依赖项。

我正在使用 twilio 7.35,它使用 org.apache.httpcomponents:4.5.6,但在我的多模块项目中,我使用的是 org.apache.cassandra:cassandra-thrift:3.0.0,它使用的是 thrift:0.9.2其中包含旧版本的 httpclient(4.2.5)。 这个 cassandra 模块的最新版本不支持最新版本的 httpClient,所以我需要确保这个 httpclient 旧的依赖不会把 twilio 搞乱。

我还分析了 mvn dependency:tree -Dverbose 的输出,似乎 4.5.6 正在被正确接收。当我尝试将它添加到父模块或调用模块时,我可以看到旧版本被 twilio 覆盖,但这并没有解决我的问题。

我开始怀疑是否有可能在同一个 maven 项目中拥有两个版本的依赖项。

【问题讨论】:

  • 请提供一个最小可行的例子。结帐stackoverflow.com/help/mcve了解更多详情!
  • 在 Maven 中,你只能在依赖树中同时拥有一个依赖版本。不过,maven shade 插件有一些丑陋的变通方法。

标签: java maven cassandra twilio thrift


【解决方案1】:

听起来您遇到的问题类似于处理 Jar Hell 的相关问题:Jar hell: how to use a classloader to replace one jar library version with another at runtime

在这种情况下,您需要在项目中使用与默认类加载器不同的类加载器。也许您可以使用URL Classloader 并从文件系统加载部分或全部较新的依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 2013-06-24
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2011-11-02
    相关资源
    最近更新 更多