如何允许类加载器从更改的jar加载类?

时间:2011-09-08 16:36:29

标签: java classloader java-6

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:0)

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

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