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-eclipse\yyproject_jmjkk\WebRoot" path="/test"/>
<!-- 方式二 -->
<Context docBase="D:\workspace-eclipse\yyproject_jmjkk\WebRoot" 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:\ProgramFiles\apache-tomcat-7.0.68-->config文件夹-->server.xml-->在<Host></Host>标签里添加<Context></Context>标签-->
ECLIPSE
  在eclipse中,左侧视图-->Server-->对应的tomcat-->server.xml-->在<Host></Host>标签里添加<Context></Context>标签-->

举例:

<Context docBase="D:\WorkSpaces\eclipse2016\demo1\WebContent" path="/demo" reloadable="false">
</Context>

注意:

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

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

写在最后

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

相关推荐:

 

tomcat 热部署、热加载 精析的更多相关文章

  1. SpringBoot SpringCloud 热部署 热加载 热调试

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] Crazy-Sp ...

  2. mysql 5.6 后热数据的加载

    mysql 5.6 后热数据的加载 转自:http://blog.itpub.net/20892230/viewspace-2127469/ 故障现象:在数据库重启后,碰巧遇到业务高峰期,连接数满,导 ...

  3. Tomcat启动,不能加载项目问题。

    项目部署时遇到的一个Tomcat问题:     启动tomcat后,不能加载项目 直接启动完成 但是项目未加载 最后找到原因:  把环境变量Catalina_HOME删除掉,就能加载. tomcat启 ...

  4. paip.提升用户体验--提升java的热部署热更新能力

    paip.提升用户体验--提升java的热部署热更新能力 想让java做到php那么好的热部署能力  "fix online"/在线修复吗??直接在服务器上修改源码生效,无需重启应 ...

  5. Tomcat启动时自动加载Servlet

    1.想做一个服务启动时自动启动一不停止的获取订阅功能 2.之前是做一个Jsp页面请求servlet来触发方法 3.现在实现Tomcat启动时自动加载Servlet 1.Tomcat中启动Servlet ...

  6. Tomcat启动时自动加载一个类

    有时候在开发Web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法. 可以 ...

  7. solr6.4.1搜索引擎(4)tomcat重启后数据加载缓慢或丢失

    解决tomcat重启后数据加载缓慢或丢失 我们在首次全量导入和第二次增量导入数据都成功后,在研究solr过程中,会反复重启tomcat. 我们会发现在重启tomcat后,core的data目录下明明已 ...

  8. 如何在tomcat启动时自动加载一个类

    有时候在开发web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法. 可以 ...

  9. C#开发BIMFACE系列48 Nginx部署并加载离线数据包

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列47 IIS部署并加载离线数据包>中详细介绍了IIS部署并访问的完整步 ...

随机推荐

  1. MyBatis接口的简单实现原理

    MyBatis接口的简单实现原理 用过MyBatis3的人可能会觉得为什么MyBatis的Mapper接口没有实现类,但是可以直接用? 那是因为MyBatis使用Java动态代理实现的接口. 这里仅仅 ...

  2. 《TCP/IP具体解释卷2:实现》笔记--IP:网际协议

    本章介绍IP分组的结构和主要的IP处理过程,包含输入,转发和输出. 下图显示了IP层常见的组织形式. 在之前的文章中.我们看到了网络接口怎样把到达的IP分组放到IP输入队列ipintrq中去,并怎样调 ...

  3. Cesium 坐标系转换

    cesium中常用的坐标有两种WGS84地理坐标系和笛卡尔空间坐标系(世界坐标).我们平时常用的以经纬度来指明一个地点就是用的WGS84坐标,笛卡尔空间坐标系常用来做一些空间位置变换如平移旋转缩放等等 ...

  4. 为iOS应用制作一个二维码

    第一步:找到你发布的ios应用的下载链接: 第二步:使用二维码转换器,将下载链接转换成 二维码.http://my.qzone.qq.com/app/100699951.html?via=appcen ...

  5. Android的基本常用的短信操作

    1.调用系统发送短信界面(传入手机号码+短信内容) 2.隐藏发送短信(指定号码指定内容)(这里隐藏只是没有反写入数据库) 3.获得收件箱接收到的短信 4.Android屏蔽新短信通知提示信息:(Con ...

  6. 【docker】linux系统centOS 7上安装docker

    要求: 一个centOS 7系统  虚拟就上安装CentOS 7步骤 本文操作在本机上使用xshell连接虚拟机上的centOS 7进行操作 1.Docker 要求 CentOS 系统的内核版本高于 ...

  7. 【spring boot】【log4jdbc】使用log4jdbc打印mybatis的sql和Jpa的sql语句运行情况

    在spring boot 中使用mybatis 想看到sql语句的运行情况. 虽然按照 之前说的配置了 logging.level.你的mapper包位置 = debug 但是依旧没有起作用. 所以采 ...

  8. Android之从Browser中打开本地的应用程序&微信检测是否有对应app

    在对应的应用程序的AndroidManifest.xml中配置: <activity android:name=".ui.TabHostActivity" android:w ...

  9. 基于MINA实现server端心跳检测(KeepAliveFilter)

    MINA自带了对心跳协议的支持,可以对心跳做出细致的配置,本文在次基础上实现了server端对client端的心跳检测. 在开始之前先简单介绍下keepAlive的机制: 首先,需要搞清楚TCP ke ...

  10. Android下拉刷新-SwipeRefreshLayout

    现在市面上新闻类的App基本上都有下拉刷新,算是一个标配吧,网上关于下拉刷新的博客也有很多,实现方式可以使用开源的PullToRefresh,自定义ListView,或者可以直接使用LineLayOu ...