我遇到了包含多个版本的jar文件的应用程序。例如commons-fileupload-1.8.jar和commons-fileupload-1.6.jar。在应用程序中使用多个版本的jar会导致问题吗?
这会导致任何问题?
感谢, 拉古拉姆
我遇到了包含多个版本的jar文件的应用程序。例如commons-fileupload-1.8.jar和commons-fileupload-1.6.jar。在应用程序中使用多个版本的jar会导致问题吗?
这会导致任何问题?
感谢, 拉古拉姆
以我的经验,肯定会的。被使用的jar将是首先加载的jar文件,它基于类加载器,而不是,我认为它是按照有保证的顺序。因此,这意味着某些代码可能取决于版本1.8中的功能,然后1.6会加载并在尝试使用时引发异常。
当然,它可能会给你不同的结果,有时取决于应用服务器,有时取决于包装。
如果你的应用程序使用了一个类,并且在两个jar文件中都声明了X,那么它们中的一个将由类加载器加载,并且可以说需要一个Y类, (通常是第一个),但不能保证它们会来自同一个罐子。
所以,如果有两个版本的相同jar你需要检查为什么发生这种情况,并尝试删除其中的一个。 (如果你正在使用maven有不同的方法来实现这一点)
是的,这是一个坏主意。 可能发生如果你幸运的话是在类路径中第一个出现的两个版本中的哪一个将满足所有的引用。如果发生这种情况,那么其他版本的.jar文件根本就不重要。但是,依赖旧版本库的旧代码可能会错误地选取新版本的某些类,因此可能会发生各种奇怪的坏事。
现在,在一个包含许多独立类加载器的应用程序中,只要具有不同类加载器的独立子系统保持不同版本的分离,这种情况就可能发生。但是,如果您正在讨论系统类路径中多个对.jar的引用,那么它不是多个类加载器的情况。
是的,它会导致问题,因为只有其中一个将被实际使用,取决于哪一个被类加载器加载以及它们被加载的顺序。
如果两个版本实际上都是通过相同的类加载器加载的,则只会有问题。通过出现在常规类路径上。
如果您通过单独的类加载器加载不同的版本,可以使其工作。 大概你看的应用程序是这样做的。或者他们只是升级了JAR并忘记删除旧版本。