gpt4 book ai didi

如果底层 jar 被替换,Java 程序会崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:12 27 4
gpt4 key购买 nike

我有一个软件,包含在一个正在运行的 .jar 中,但有时我需要快速修复错误,需要在中央位置替换 .jar 文件,不幸的是,如果当前正在运行执行如果我替换这个 jar 文件,它会因“找不到类”错误而崩溃。我认为一旦执行 jar 文件,JVM 会将其缓存在内存中并且不会从磁盘读取任何数据,但显然情况并非如此,如何(如果可能的话)解决这个问题?

编辑:

该应用程序不是基于网络的。这是普通的 Java SE。

最佳答案

JAR 文件不会像其他共享对象库那样批量加载到内存中。它们的类是按需加载到内存中的,所以如果你删除一个 JAR 文件并且需要进行类查找,类加载器的文件句柄将无效(因为它引用的打开文件现在已经不存在了)你会得到一个错误。

操作系统管理文件句柄,因此用新副本替换打开的文件不会骗到任何人。您需要先关闭文件,这通常只能通过垃圾收集类加载器来完成。如果您正在使用系统类加载器,则意味着关闭 JVM。

人们已经编写了框架来创建可以独立于系统类加载器处理的自定义类加载器;然而,这确实使类加载复杂化。虽然它可以完成您的要求,但如果不重构您现有的程序以适应框架类加载器中的类查找(并适应类加载器随时间的损失和增益),它就无法实现。

如果您想尝试这样的框架,请参阅 Christian 的帖子。如果您想更多地了解一个项目如何使用类加载器来满足其需求,请看一看 Apache 的 Tomcat,它将 Web 应用程序限制在自己的类加载器中。

通常您可能会发现正确的答案确实是在部署之前停止服务,并在部署之后启动它。

关于如果底层 jar 被替换,Java 程序会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10740932/

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