Java Tomcat:热部署新jar

Java Tomcat:热部署新jar,java,tomcat,jar,Java,Tomcat,Jar,你能在Tomcat5上热部署JAR文件吗?这样做的目的是避免重新启动Tomcat,并且仍然能够(通过反射)从新添加的JAR加载一些类。 能做到吗?怎么用?对于生产系统来说,这是不明智的吗? 谢谢 编辑:我的场景需要添加新的JAR文件,这些文件的名称事先不知道。服务器是否可以“监视”JAR目录而不是特定的JAR?是的,这是可能的,假设已打开自动展开: 如果WAR文件没有相应的目录,它将自动展开和部署 对WEB-INF\WEB.xml的更改将导致重新加载应用程序 对分解的WAR文件的更新将导致重新部

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

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

是的,这是可能的,假设已打开自动展开:

  • 如果WAR文件没有相应的目录,它将自动展开和部署
  • 对WEB-INF\WEB.xml的更改将导致重新加载应用程序
  • 对分解的WAR文件的更新将导致重新部署
  • 对XML配置文件的更改应该会导致重新部署
  • 当然,这对于生产系统是不可取的。这并不是说这个特性有问题,而是应用程序可能编码不好,无法在取消部署时清理资源或卸载类。这将导致某些类保留在内存中。当重新部署应用程序的较新版本时,由于存在较旧版本的类,您将遇到模糊的错误。写得不好的单身汉往往是这个问题的最大原因


    为了避免任何类似的问题,我遵循的协议是取消部署应用程序、关闭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();
            ...
       }