【发布时间】:2015-01-23 17:27:34
【问题描述】:
假设您有一个项目(网络应用程序)使用 2 个第三方库 - A 和 B。
说 A 依赖于另一个第三方库 C 的 1.10 版本。
说B依赖同一个第三方库C的1.15版本。
您应该将哪个版本的 C 放在您的 Web 应用项目的 lib 文件夹中?!
假设您不太了解 C,您不确定 C 1.15 是否与 1.10 兼容,或者类似的东西。
有没有办法将 A.jar 和 B.jar 以及两个 C jar 放在项目的 lib 文件夹中,但在运行时(例如在 Tomcat 或 JBoss 下)有 A 加载 C 1.10 jar,但有 B 加载C 1.15 罐。
我认为这是不可能的,因为它们共享同一个 Web 应用程序类加载器(因此它几乎无法预测地从 1.10 或 1.15 加载 C 类;这两个 JAR 中的哪一个恰好是第一个出现在类路径)...但我不确定。
如果确实不可能,那么处理此类冲突的最佳做法是什么?
【问题讨论】:
-
您不应该编写需要同一库的 2 个版本的代码。那只是遵循糟糕的编码标准。我建议您更新到最新版本的库,然后根据需要更新代码以兼容。
-
@MikeElofson 请注意,我没有编写代码。我只想使用 A 和 B 这两个无关的第三方库。它们依赖于不同版本的 C。
-
而且您使用的库没有自己将所需的 jar 打包到库中?
-
说他们没有(他们不是超级罐子),说他们有(他们是超级罐子)。我会很感激答案是两种情况。事实上,这一切不是由同一个类加载器加载的吗?我在这里寻找最佳实践,因为我经常偶然发现此类问题,但我还没有针对它们的通用解决方案。所以我通常只需要使用 C 的 1.15 版本(在运行时),并希望 A 也能正常工作(但我当然不能保证)。
-
Maven 将选择最接近依赖树根的那个——直接依赖比一级传递依赖(dep-of-a-dep)更受欢迎,而后者又优于二级(dep-of-a-dep-of-a-dep)。
标签: java tomcat web-applications jar jboss