Tomcat:热部署新的jar

你能在Tomcat 5上热部署JAR文件吗? 我们的想法是避免重新启动Tomcat,并且仍然可以从新添加的JAR中加载(通过reflection)某些类。 可以吗? 怎么样? 生产系统是不可取的? 谢谢

编辑 :我的场景需要添加新的JAR文件,这些文件的名称事先是未知的。 服务器可以“观察”JAR目录而不是特定JAR吗?

Tomcat不提供任何重新加载单个JAR的机制。 但是,可以重新加载整个上下文。

你只需要告诉Tomcat在context.xml中监视你的JAR,就像这样,

  WEB-INF/web.xml WEB-INF/lib/your.jar   

我们在生产上这样做。 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(); ... } 

对的,这是可能的。 假设自动部署已打开, 来自Tomcat稳定版的一些技巧 :

  1. 如果WAR文件没有相应的目录,它将自动展开和部署。
  2. 对WEB-INF \ web.xml的更改将导致重新加载应用程序。
  3. 对爆炸的WAR文件的更新将导致重新部署
  4. 对XML配置文件的更改应该导致重新部署

当然,这不适用于生产系统。 并不是说这个function有问题,但应用程序的编码很差,无法清理资源或在取消部署时卸载类。 这将导致某些类保留在内存中。 重新部署较新版本的应用程序时,由于存在较旧版本的类,您将遇到模糊的错误。 写得不好的单身人士往往是这个问题的最大原因。

我遵循的协议,以避免任何类似的问题是取消部署应用程序,关闭Tomcat,validationTomcat的文件系统目录的“健全性”,删除任何遗留的资源,重新启动Tomcat实例并重新部署应用程序。 它确实看起来有点沉重,但我已经烧得够多了。