您可以在Tomcat 5上热部署JAR文件吗?我们的想法是避免重新启动Tomcat,并且仍然能够从新添加的JAR中加载(通过反射)某些类。 可以吗?怎么样?对生产系统不建议吗? 感谢
编辑:我的方案需要添加新的JAR文件,这些文件的名称事先是未知的。服务器可以“观察”JAR目录而不是特定的JAR吗?
答案 0 :(得分:12)
Tomcat没有提供任何重新加载单个JAR的机制。但是,可以重新加载整个上下文。
你只需告诉Tomcat在context.xml中监视你的JAR,就像这样,
<?xml version="1.0" encoding="UTF-8"?>
<Context override="true" swallowOutput="true" useNaming="false">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/lib/your.jar</WatchedResource>
<Manager pathname=""/>
</Context>
我们在生产上这样做。 Tomcat曾经有过一些内存泄漏,但我们没有发现Tomcat 5.5或更高版本的任何问题。
不知道是否还有必要。我们必须进行以下调用以避免在热部署期间发生内存泄漏。
public void contextDestroyed(ServletContextEvent sce) {
// To fix the known memory leaks during re-deploy
ClassLoader contextClassLoader =
Thread.currentThread().getContextClassLoader();
LogFactory.release(contextClassLoader);
java.beans.Introspector.flushCaches();
...
}
答案 1 :(得分:9)
是的,有可能。 A few tricks from the Tomcat stable,假设已启用自动部署:
当然,这不适用于生产系统。并不是说这个功能有问题,但是应用程序的编码很差,不能清理资源或在取消部署时卸载类。这将导致某些类保留在内存中。重新部署应用程序的较新版本时,由于存在较旧版本的类,您将遇到模糊的错误。写得不好的单身人士往往是造成这个问题的最大原因。
我遵循的协议,以避免任何类似的问题是取消部署应用程序,关闭Tomcat,验证Tomcat的文件系统目录的“健全性”,删除任何遗留的资源,重新启动Tomcat实例并重新部署应用程序。它确实看起来有点沉重,但我已经烧得太厉害了。