代码之家  ›  专栏  ›  技术社区  ›  Germán

tomcat:热部署新jar

  •  13
  • Germán  · 技术社区  · 15 年前

    你能在Tomcat 5上热部署JAR文件吗?这样做的目的是避免重新启动tomcat,并且仍然能够从新添加的jar加载(通过反射)一些类。 可以这样做吗?怎样?对于一个生产系统来说是不可取的吗? 谢谢

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

    2 回复  |  直到 15 年前
        1
  •  13
  •   ZZ Coder    15 年前

    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以前有一些内存泄漏,但是我们没有发现Tomcat5.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();
            ...
       }
    
        2
  •  9
  •   Vineet Reynolds    15 年前

    是的,这是可能的。 A few tricks from the Tomcat stable ,假设自动部署被打开:

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

    当然,这对于生产系统是不可取的。不是这个特性是错误的,但是应用程序不能很好地编码,不能在未部署时清理资源或卸载类。这将导致某些类留在内存中。重新部署较新版本的应用程序时,由于存在较旧版本的类,您将遇到模糊错误。单子写得不好,往往是这个问题的最大原因。

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