Java加载非JAR扩展名的文件

时间:2016-07-15 17:02:14

标签: java jar jvm classpath

这是我的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)

1 个答案:

答案 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中未指定的目录中的其他位置。