这是我的Java版本:
# java -version
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 2.2)
IBM J9SE VM (build 2.2, J2RE 1.4.2 IBM J9 2.2 Linux amd64-64 j9xa64142-20080130 (JIT enabled)
J9VM - 20071205_1933_LHdSMr
JIT - r7_level20071016_1845)
(这是IBM Information Server的一部分)
我必须将一些更新部署到实时应用程序,因此我必须替换现有的jar
文件之一。显然,我对旧mylibrary.jar
文件进行了备份,并将其称为mylibrary.jar.old
。
启动应用程序后,经过几个小时的调试后,我注意到 - 由于某些原因 - mylibrary.jar
未加载,mylibrary.jar.old
实际已加载。
实际上,它们都位于类路径中,但我希望不会加载具有非JAR扩展名的文件。我确信这就是现在的情况,我可以重现这个问题。
我错过了什么吗?我无法在甲骨文的网站上找到任何相关内容。
编辑:我还使用Oracle的Java测试过,同样的事情发生了。
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
答案 0 :(得分:3)
实际上是加载了类,而不是jar。 jar是一种zip格式,JVM
通过拉开jar来懒惰地加载类。
使用java extension机制,JVM可能会在不一定具有.jar扩展名的文件(zip)中加载类。
页面here详细说明了VM如何加载没有扩展名的jar。
格式为mylibrary.jar.old
的旧jar可以完全解压缩。使用7-zip
进行测试。因此,JVM可以在需要时从这个旧jar加载类,现在为什么它不从mylibrary.jar
而不是mylibrary.jar.old
获取?我猜这是因为JVM默认类加载可能会通过Date Modified
查看jar,因为已经找到了一个类,JVM不会在其他jar中查找。
此外,我希望从您的应用程序中删除mylibrary.jar.old
,并将其备份到java classpath
中未指定的目录中的其他位置。