Java Tomcat:热部署新jar
你能在Tomcat5上热部署JAR文件吗?这样做的目的是避免重新启动Tomcat,并且仍然能够(通过反射)从新添加的JAR加载一些类。 能做到吗?怎么用?对于生产系统来说,这是不明智的吗? 谢谢 编辑:我的场景需要添加新的JAR文件,这些文件的名称事先不知道。服务器是否可以“监视”JAR目录而不是特定的JAR?是的,这是可能的,假设已打开自动展开:Java Tomcat:热部署新jar,java,tomcat,jar,Java,Tomcat,Jar,你能在Tomcat5上热部署JAR文件吗?这样做的目的是避免重新启动Tomcat,并且仍然能够(通过反射)从新添加的JAR加载一些类。 能做到吗?怎么用?对于生产系统来说,这是不明智的吗? 谢谢 编辑:我的场景需要添加新的JAR文件,这些文件的名称事先不知道。服务器是否可以“监视”JAR目录而不是特定的JAR?是的,这是可能的,假设已打开自动展开: 如果WAR文件没有相应的目录,它将自动展开和部署 对WEB-INF\WEB.xml的更改将导致重新加载应用程序 对分解的WAR文件的更新将导致重新部
为了避免任何类似的问题,我遵循的协议是取消部署应用程序、关闭Tomcat、验证Tomcat文件系统目录的“健全性”、删除任何遗留资源、重新启动Tomcat实例并重新部署应用程序。它看起来确实有点笨手笨脚,但我已经受够了。Tomcat没有提供任何机制来重新装入一个罐子。但是,可以重新加载整个上下文 您只需要告诉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>
+1用于LogFactory.release()调用。虽然我不使用ApacheCommons日志,但正是这样的代码增加了应用程序的可信度。更多信息@
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();
...
}