0

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

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

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

4

2 回答 2

2

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

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

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

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

大多数现代 servlet 容器都允许自动重新部署。一个好的,小的是码头。

于 2011-09-08T17:17:43.393 回答
0

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

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

于 2011-09-08T16:48:17.150 回答