JAR版本依赖冲突-Java

JAR版本依赖冲突-Java,java,tomcat,web-applications,jar,jboss,Java,Tomcat,Web Applications,Jar,Jboss,假设您有一个使用两个第三方库(a和B)的项目(web app)。 假设A依赖于另一个第三方库C的1.10版。 假设B依赖于同一第三方库C的1.15版 您应该将哪个版本的C放在web应用程序项目的lib文件夹中 假设您对C不太了解,您不确定C1.15是否与1.10兼容,或者类似的东西 有没有一种方法可以将a.jar和B.jar以及这两个C.jar放在项目的lib文件夹中,但在运行时(例如在Tomcat或JBoss下)有一个load C 1.10 jar,但有B load C 1.15 jar 我认

假设您有一个使用两个第三方库(a和B)的项目(web app)。
假设A依赖于另一个第三方库C的1.10版。
假设B依赖于同一第三方库C的1.15版

您应该将哪个版本的C放在web应用程序项目的lib文件夹中

假设您对C不太了解,您不确定C1.15是否与1.10兼容,或者类似的东西

有没有一种方法可以将a.jar和B.jar以及这两个C.jar放在项目的lib文件夹中,但在运行时(例如在Tomcat或JBoss下)有一个load C 1.10 jar,但有B load C 1.15 jar

我认为这是不可能的,因为它们共享同一个web应用程序类加载器(因此它将从1.10或1.15加载C类,这几乎是不可预测的;两个JAR中的任何一个恰好是类路径上的第一个)。。。但我不确定

如果确实不可能,处理此类冲突的最佳做法是什么

可以提出两种解决方案- 1) 使用不同版本的jar为A和B编写类装入器。您可以将C jar文件放在web应用程序的lib中的两个不同文件夹中。并使用不同的类装入器为A和B创建对象。这是一个有点实际的方法,但会起作用


2) 虽然不确定,但OSGI可能会有所帮助

您不应该编写需要相同库的两个版本的代码。这只是遵循了糟糕的编码标准。我建议您更新到库的最新版本,然后根据需要更新代码以使其兼容。@MikeElofson注意,我没有编写代码。我只想使用A和B,它们是两个不相关的第三方库。它们依赖于不同版本的C。而您正在使用的库本身并没有将它们所需的JAR打包到库中?说它们没有(它们不是uber JAR),说它们有(它们是uber JAR)。如果两种情况都适用,我将不胜感激。事实上,所有这些不是由同一个类加载器加载的吗?我在这里寻找一个最佳实践,因为我经常遇到这样的问题,而且我还没有一个通用的解决方案。所以我通常只需要C的1.15版本(在运行时),只希望A也能很好地使用它(当然,我对此没有保证)。Maven会选择最接近依赖树根的一个-直接依赖优先于一级传递依赖(dep-of-A-dep),与第二级(dep-of-a-dep-of-a-dep)相比,后者更为可取。