我们有一个服务器端 Java6 应用程序在相当多的 linux 服务器上运行。有时,有人会在应用程序运行时不小心升级 jar 文件。
发生这种情况时,下一次尝试加载尚未使用的类(通常是 ShutdownHandler 代码)会失败,并出现 ClassNotFoundException。
我想告诉类加载器,可以读取更改后的 jar 文件以获取它需要的类。我不介意这是否会导致类加载器重新读取已加载的类,尽管这不是必需的。
我们有一个服务器端 Java6 应用程序在相当多的 linux 服务器上运行。有时,有人会在应用程序运行时不小心升级 jar 文件。
发生这种情况时,下一次尝试加载尚未使用的类(通常是 ShutdownHandler 代码)会失败,并出现 ClassNotFoundException。
我想告诉类加载器,可以读取更改后的 jar 文件以获取它需要的类。我不介意这是否会导致类加载器重新读取已加载的类,尽管这不是必需的。
您必须为此创建自己的类加载器,并且 jar 必须在类路径之外,以免干扰现有的类加载器。
当检测到 jar 已更改(每 X 秒查看文件标记)然后告诉您的应用程序停止,丢弃旧的类加载器,创建一个新的类加载器,并告诉您的应用程序在新的类加载器中启动。
你必须这样做,否则instanceof
与朋友将无法正常工作。(如果您想了解更多相关信息,请查看 JNDI 的所有细节)。
执行此操作的最简单方法是将其编写为 Web 应用程序 (WAR) 并将其部署到 servlet 容器中,在该容器中您需要做的事情是作为 Web 应用程序设置和拆除的一部分完成的。您不需要 servlet 容器来提供 Web 服务器(http 端口侦听器等)。
大多数现代 servlet 容器都允许自动重新部署。一个好的,小的是码头。
问题很可能是打开的原始文件已被删除。(并替换)虽然新 jar 可能具有相同的文件名,但它不是原始文件。您应该能够自定义 ClassLoader 以允许这样做,但除非您的应用程序服务器已经支持这一点,否则它不太可能工作。
真正的答案是在应用程序运行时不要更改它。