java - 在运行时更新 JAR

标签 java jvm classpath classloader

假设 jar 在 JVM 中运行,是否可以卸载当前运行的 Jar 并将其从系统中删除。下载新版本并将其重命名为与上一个 Jar 相同的名称,然后初始化新 Jar,从而在 JVM 中创建 Jar 的无缝更新。甚至可以指示 JVM 执行此操作吗?是否可以在运行时更新 Jar?

最佳答案

Download a new version and rename it with the same name of the last Jar and then initialise the new Jar, creating a seamless update of the Jar within the JVM ... Is it even possible to update a Jar whilst its running?

JAR 文件没有“运行”,JVM 正在运行。您的 JAR 文件仅包含使 JVM 执行有用工作的类信息(也称为字节码指令)。在大多数情况下,JVM 实际上不会在您的 JAR 文件上设置系统锁,因此您可以将该文件替换为您心中的内容。

当然,真正的问题是,一旦 JVM 加载了您的 JAR,它就会愉快地携带它加载的内容,并且再也不会从您的 JAR 文件中读取,无论您覆盖它多少次。这是默认类加载器的行为,无法更改 - 但是正如其他人指出的那样 - 您不必使用默认类加载器。您可以实现自己的,类似于 Web 应用程序服务器使用的,以便从文件系统加载更新的 JARS。不过需要注意的是——除非你真的知道你在做什么,否则定义你自己的类加载器被认为是一个“坏主意”。您可以阅读更多 herehere .

关于java - 在运行时更新 JAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6477318/

相关文章:

java - 验证 Jar 内的 Java 类

java - 多个虚拟机的垃圾收集

java - jar文件的类路径问题

java - 用于查找包中所有类的反射库

java - MySQL 服务器错误

java - Wildfly 禁用日志记录子系统

java - CMS 相对于 Java 的垃圾收集器意味着什么?

java - 通过类路径执行 java -jar vs 在 jar 文件目录中执行 java -jar

java - eclipse - 查找并替换变量名称中的下划线字符

java.lang.IncompleteClassChangeError : Implementing class issue