Tomcat:热部署新的jar

Ger*_*mán 14 java tomcat jar

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

编辑:我的场景需要添加新的JAR文件,其名称事先不知道.服务器可以"观察"JAR目录而不是特定的JAR吗?

ZZ *_*der 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>
Run Code Online (Sandbox Code Playgroud)

我们在生产上这样做.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();
        ...
   }
Run Code Online (Sandbox Code Playgroud)


Vin*_*lds 9

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

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

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

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