Java 在应用程序中使用jar的多个版本会导致问题吗?

Java 在应用程序中使用jar的多个版本会导致问题吗?,java,jar,classpath,Java,Jar,Classpath,我遇到了一个应用程序,其中包含多个版本的jar文件。例如commons-fileupload-1.8.jar和commons-fileupload-1.6.jar 这会导致任何问题吗 谢谢, 依我的经验,是的,它会的。使用的jar将是首先加载的jar,它是基于类装入器的,我认为不是以保证的顺序。因此,这意味着某些代码可能依赖于1.8版中的某个功能,然后1.6版会被加载,并在您尝试使用它时引发异常。当然,它可能会给您带来不同的结果,有时取决于应用服务器,有时取决于打包 如果您的应用程序使用了一个类

我遇到了一个应用程序,其中包含多个版本的jar文件。例如commons-fileupload-1.8.jar和commons-fileupload-1.6.jar

这会导致任何问题吗

谢谢,
依我的经验,是的,它会的。使用的jar将是首先加载的jar,它是基于类装入器的,我认为不是以保证的顺序。因此,这意味着某些代码可能依赖于1.8版中的某个功能,然后1.6版会被加载,并在您尝试使用它时引发异常。

当然,它可能会给您带来不同的结果,有时取决于应用服务器,有时取决于打包

如果您的应用程序使用了一个类,比如两个jar中都有X,那么类加载器将加载其中的X.class,并且假设需要一个Y类,这个Y类位于两个jar中,那么其中一个将被加载(通常是第一个),但不能保证它们来自同一个jar


所以,如果同一个jar有两个版本,那么您需要检查为什么会发生这种情况,并尝试删除其中一个版本。(如果您正在使用maven,有不同的方法来实现这一点)

是的,这是个坏主意。如果幸运的话,可能会发生的情况是,类路径中的两个版本中的任何一个都会满足所有引用。如果发生这种情况,那么.jar文件的其他版本就根本不重要了。然而,依赖旧版本库的旧代码可能会错误地获取某些类的新版本,因此可能会发生各种奇怪的坏事


现在,在一个有许多独立类加载器的应用程序中,只要有独立类加载器的独立子系统保持不同版本的分离,这样的事情就可能解决。但是,如果您谈论的是对系统类路径中.jar的多个引用,那么就不是多个类加载器的情况。

是的,这会导致问题,因为根据类加载器加载的是哪个类加载器,实际上只会使用其中的一个以及它们的加载顺序。

只有当两个版本实际上都是通过同一个类加载器加载的,例如,都出现在常规类路径上时,才会出现问题

如果通过单独的类加载器加载不同的版本,则可以使其工作。 您所看到的应用程序大概就是这样做的。或者他们只是升级了JAR,忘记删除旧版本