zoukankan      html  css  js  c++  java
  • tomcat 热部署、热加载 精析

     

    1.前言

      找了很多篇文章,没有一篇文章讲的清晰、明了,很多人只是会用,但不是能真正说明白,这年头找个懂理论的,真难!  

    2.热部署

      原定义:tomcat处于运行状态时,能够监测webapps下的文件,如果有新的web应用加入进来,会自运发布这个WEB应用。

      实现方式:将Host标签的autoPlay设置为true(这个是默认的)

       打开tomcat的server.xml,你会发现:有一个<Host>标签,如果你没有修改过,就应该是这样的:

     <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
    ...
    </Host>
    

      Host标签,有属性"autoPlay",其值为"true",表示的含义是:

      如果此项设为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,如果有新有web应用加入进来,会自动发布这个WEB应用。

      证明:

      第一步:启动tomcat服务器,且webapps目录下没有web项目

      第二步:往该目录下复制一个项目

      tomcat下执行结果:tomcat正在自动发布该项目

      第四步:将该项目从webapps目录下移除

      tomcat下执行结果:取消该部署项目

      对于热部署的延伸

      定义:对Java文件进行修改后,不需要重启tomcat服务器,即时生效,即:在运行时更新Java类文件。

      实现方式:在Host标签内添加Context标签

    <!-- 方式一 -->
    <Context docBase="D:workspace-eclipseyyproject_jmjkkWebRoot" path="/test"/>
    <!-- 方式二 -->
    <Context docBase="D:workspace-eclipseyyproject_jmjkkWebRoot" path="/test" reloadable="false"/>
    

      注意:

      声明reloadable属性时,值必须设置为false;

      如果开发工具是eclipse,必须eclipse中修改server.xml,原因见热加载。

      实现原理:

      以纯JavaWeb项目为例,

      Java文件修改后,需要编译成class文件,我们之所以没有进行手动编译,是因为依赖于eclipse的自动编译功能(这件事eclipse帮我们做了);

      编译好的class文件都会被放到WebContent/WebRoot/WEB-INF/classes目录下;

      tomcat的Context标签的docBase属性的值指定为web项目的发布目录(WebContent/WebRoot)后,启动tomcat后,tomcat会直接访问将该目录下的文件;

      只有debug模式下才会将其加载到tomcat容器中;

      对于jsp的更新:jsp每次被调用,tomcat容器都会通过ClassLoader重新加载相应的jsp编译后的class文件并装载到JVM中;

      对于Java类的更新:当监听到class文件被修改后,通过动态修改内存中的字节码,将修改过的class文件再次装载到JVM中。

    3.热加载

      当Context标签的reloadable属性的值为true时,就实现了热加载。

      定义:tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。  

      前提:只有在debug模式下,该属性才起作用,普通模式下,就算你reloadable="true",也不会生效(class文件不会被更新,tomcat不会重启)。

      不推荐使用:因为只要你一修改代码,都自动会重启tomcat,我们必须等待项目重启后才能操作,简直是浪费时间。

      在debug模式下,修改完class文件后,即使不重启tomcat,jvm也会即时生效(tomcat自动将更新后的文件装载到JVM)。

      如何关闭tomcat的重启?

      打开运行项目的tomcat的配置文件,server.xml

      将你已经发布的项目对应的Context标签中的reloadable的值改为false,以debug模式重启tomcat即可。

       

      说明:必须在eclipse中修改server.xml,不要跑到tomcat的安装目录下修改该文件。

      因为eclipse中server.xml会覆盖tomcat本身自带的server.xml,所以就算你修改了也不会生效!

    4.Context标签参数介绍

      <Context>代表了运行在<Host>上的单个Web应用;

      一个<Host>可以有多个< Context>元素,一个Context代表一个web应用;

      每个Web应用必须有唯一的URL路径,这个URL路径在<Context>中的属性path中设定。
      <Context path="/helloApp" docBase="helloApp" reloadable="false"/>
      <Context>元素的属性介绍:
      path:指定访问该Web应用的URL入口;

        a.可以自定义访问项目的请求路径;b.该参数不能省略;c.该参数的值不能为空。
      docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于<Host>的appBase属性的相对路径,

      如果Web应用采用开放目录结构,则指定Web应用的根目录,如果Web应用是个war文件,则指定war文件的路径。

        绝对路径构成:"项目的路径"+"WebRoot/WebContent即WEB-INF的上级目录"
      reloadable:WEB-INF/classes和WEB-INF/lib目录下class文件内容发生改变时,是否重新发布

        如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用 ,也就是热加载;    

    UpdateTime--2016年12月25日09:19:24

    好处:可以减少启动tomcat次数  

    说明:xml文件在项目启动时,会将其加载到内存中,其他文件修改信息后可以不用重新发布
      其中,下面指定文件的内容发生变化时,不需要重启tomcat
      *.jsp文件
      *.js文件 -->如果有缓存,可以采用问号传参的方式避免缓存,在引入该文件的jsp页面后添加"?v=111",例:
        <script type="text/javascript" src="<c:url value="/xnh/server/monitor/appro/hosappro_index.js?v=111"/>"></script>
      *.java文件 -->这种只适合修改方法里的内容,如果内容发生变化,提示需要重启tomcat,则需要重启
      *.grf文件
    注意:
      *.xml,*.properties文件内容发生变化时,需要重启tomcat才能生效
    这种加载项目的方式与将项目发布到tomcat的区别:  

      区别一:上面指出的好处
      区别二:

        加载的项目会随着的tomcat的启动和关闭而产生或死亡,不会留下任何痕迹(work文件夹除外),而将项目发布到tomcat的方式,实际上是将项目发布到tomcat指定的发布目录webapps文件夹,所以当切换运行项目时,采用热部署的方式不会运行额外的项目,而采用发布的方式则需要将清理webapps文件夹才能保证只加载该项目到tomcat中

      区别三:启动多个项目的方式不同    

      启动前准备工作:
        在多个项目中的web.xml文件中添加配置

    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>jmyb_ty</param-value>
    </context-param>
    <!-- <param-value>该参数值需确保唯一性</param-value> -->  

      热部署方式可以同时启动多个项目,只需要在server.xml文件中配置多个<Context></Context>标签即可;
      采用发布方式,需先多次启动将项目依次发布到webapps文件夹中,然后启动tomcat。

    具体配置:
      MYECLIPSE  

      找到tomcat的安装路径:D:ProgramFilesapache-tomcat-7.0.68-->config文件夹-->server.xml-->在<Host></Host>标签里添加<Context></Context>标签-->
    ECLIPSE
      在eclipse中,左侧视图-->Server-->对应的tomcat-->server.xml-->在<Host></Host>标签里添加<Context></Context>标签-->

    举例:

    <Context docBase="D:WorkSpaceseclipse2016demo1WebContent" path="/demo" reloadable="false">
    </Context>

    注意:

      a.<Context></Context>标签的"C"一定得大写;

      b.其中,<Context></Context>标签中可以配置数据库连接池,详情见文章tomcat连接数据库

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    两种类型插件系统
    ArcEngine序列化IFeatureRenderer对象
    [WorldWind学习]14.ConfigurationLoader类
    [WorldWind学习]15.模型加载
    AE应用程序开发的思考
    [C++摘抄]void*
    XML文件读写学习
    EA正向工程
    Word2010利用公式编辑器实现公式“显示”“居中”公式编号右对齐
    [Qt]Hello Qt !
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/7141784.html
Copyright © 2011-2022 走看看