Maven 子依赖在运行时与 Twilio 发生冲突

Maven subdependency conflict at runtime with Twilio

由于 Maven 子依赖问题,在运行时出现 class 未找到错误:

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

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

我正在使用使用 org.apache.httpcomponents:4.5.6 的 twilio 7.35,但在我的多模块项目中,我使用的是 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 项目中有两个版本的依赖项。

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

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