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