gpt4 book ai didi

Java 加载非 JAR 扩展名的文件

转载 作者:行者123 更新时间:2023-12-01 21:24:40 24 4
gpt4 key购买 nike

这是我的 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 网站上找不到任何与此相关的内容。

<小时/>

编辑:我还使用 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)

最佳答案

实际上加载的是类,而不是 jar。 jar是一种 zip 格式,JVM 通过解压缩 jar 来延迟加载类。

使用java extension由于这种机制,JVM 可能会加载文件 (zip) 中的类,而该文件不一定具有 .jar 扩展名。

页面here详细解释了 VM 如何加载甚至没有扩展名的 jar。

您的旧 jar 格式为 mylibrary.jar.old 可以完美解压。使用 7-zip 进行测试。因此,JVM 可以在需要时从这个旧 jar 加载类,现在为什么它不从 mylibrary.jar 而不是从 mylibrary.jar.old 获取类呢?我猜这是因为 JVM 默认类加载可能会按修改日期查找 jars,并且因为已经找到一个类,JVM 不会费心查找其他 jars。

此外,我宁愿从应用程序中删除 mylibrary.jar.old 并将其备份到 java classpath 中未指定的目录中的其他位置。

关于Java 加载非 JAR 扩展名的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38401586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com