【问题标题】:How to allow the classloader to load classes from a changed jar?如何允许类加载器从更改的 jar 加载类?
【发布时间】:2025-12-18 12:50:01
【问题描述】:

我们有一个服务器端 Java6 应用程序在很多 Linux 服务器上运行。有时,有人会在应用程序运行时不小心升级 jar 文件。

当这种情况发生时,下一次尝试加载尚未使用的类(通常是 ShutdownHandler 代码)会失败,并出现 ClassNotFoundException。

我想告诉类加载器,可以读取更改后的 jar 文件来获取它需要的类。我不介意这是否会导致类加载器重新读取已加载的类,尽管这不是必需的。

【问题讨论】:

  • 你用的是什么服务器..???

标签: java classloader java-6


【解决方案1】:

您必须为此创建自己的类加载器,并且 jar 必须在类路径之外,以免干扰现有的类加载器。

当检测到 jar 已更改(每 X 秒查看文件标记)然后告诉您的应用程序停止,丢弃旧的类加载器,创建一个新的类加载器,并告诉您的应用程序在新的类加载器中启动.

您必须这样做,否则instanceof 与朋友将无法正常工作。 (如果您想了解更多相关信息,请查看 JNDI 的所有细节)。

您最简单的方法是将其编写为 Web 应用程序 (WAR) 并将其部署到 servlet 容器中,您需要做的事情是作为 Web 应用程序设置和拆除的一部分完成的.您不需要 servlet 容器来提供 Web 服务器(http 端口侦听器等)。

大多数现代 servlet 容器都允许自动重新部署。 Jetty 是一个不错的小型项目。

【讨论】:

    【解决方案2】:

    问题很可能是打开的原始文件已被删除。 (并替换)虽然新 jar 可能具有相同的文件名,但它不是原始文件。您应该能够自定义 ClassLoader 以允许这样做,但除非您的应用程序服务器已经支持这一点,否则它不太可能工作。

    真正的答案是不要在运行时更改应用程序。

    【讨论】: