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

时间:2010-03-11 15:40:52

标签: java jar classpath

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

这会导致任何问题吗?

谢谢, 拉古拉姆

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果两个版本实际上都是通过相同的类加载器加载的,那么只会出现问题。通过出现在常规类路径上。

如果通过单独的类加载器加载不同的版本,则可以使其工作。 据推测,您看到的应用程序正在执行此操作。或者他们刚刚升级了JAR而忘记删除旧版本。

答案 3 :(得分:0)

当然,根据应用服务器的不同,它可能会给你不同的结果,有时还取决于包装。

如果你的应用程序在两个jar中都使用了一个类说X,那么它们中的一个将由类加载器加载,并且假设需要一个类Y,它们同时位于两个jar中,其中一个将是加载(通常是第一个),但不能保证它们将来自同一个罐子。

因此,如果同一个jar有两个版本,你需要检查为什么会这样,并尝试删除其中一个。 (如果你正在使用maven,有不同的方法来实现这一点)

答案 4 :(得分:0)

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