繁体   English   中英

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

[英]How to allow the classloader to load classes from a changed jar?

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

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

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

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

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

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

实现此目的的最简便方法是将其编写为Web应用程序(WAR),然后将其部署到Servlet容器中,在该容器中您需要做的事情是Web应用程序的安装和拆卸的一部分。 您不需要Servlet容器即可显示Web服务器(http端口侦听器等)。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM