Tomcat:热部署新的jar

时间:2009-09-07 18:26:04

标签: java tomcat jar

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

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

2 个答案:

答案 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,假设已启用自动部署:

  1. 如果WAR文件没有相应的目录,它将自动展开和部署。
  2. 对WEB-INF \ web.xml的更改将导致重新加载应用程序。
  3. 对爆炸的WAR文件的更新将导致重新部署
  4. 对XML配置文件的更改应该导致重新部署
  5. 当然,这不适用于生产系统。并不是说这个功能有问题,但是应用程序的编码很差,不能清理资源或在取消部署时卸载类。这将导致某些类保留在内存中。重新部署应用程序的较新版本时,由于存在较旧版本的类,您将遇到模糊的错误。写得不好的单身人士往往是造成这个问题的最大原因。

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