« 上一篇下一篇 »

如何在不重启服务器的情况下更新代码,Eclipse和tomcat 实施热部署的方法详解

   概述

1、 热部署:就是容器状态在运行的情况下重新部署整个项目.在这种情况下一般整个内存会清空,重新加载.简单来说就是Tomcat或者其他的web服务器会帮我们重新加载项目.这种方式可能会造成session丢失等情况。

2、热加载:就是容器状态在运行的情况下重新加载改变编译后的类.在这种情况下内存不会清空,sessin不会丢失,但容易造成内存溢出,或者找不到方法。因为内存无法转变成对像. 一般改变类的结构和模型就会有异常,在已经有的变量和方法中改变是不会出问题的。

   上个月做项目的期间碰上修改代码之后,需要重新启动项目方可使的新增加的代码生效的问题,因为项目比较大,重启启动过程比较慢,影响服务器的运转,之前做项目用的jrebel的插件,最近不能用了,花了很长时间在网上找了搜了很多解决方案,今天告诉大家如何使用eclipse自身的功能实现热加载,在此记录一下,方便遇到相同问题的朋友参考下:

一、eclipse配置热启动:

在基于Java的实现热部署、热加载的过程中,类装入器扮演着重要的角色。类装入器不能重新装入一个已经装入的类,否则会报java.lang.LinkageError,但只要使用一个新的类装入器实例,就可以将类再次装入一个正在运行的应用程序。一般debug模式都支持热加载。‍

但我在这里遇到了eclipse使用debug启动却并没有热加载的状况,这样对于开发来说是非常耗时的,因为每更改一次class文件都需要重新编译。下面我就如何使用eclipse进行热加载,做一个简单介绍:

启动eclicpse 找到下面这个目录

 

 

打开server.xml,找到


代码如下:

<Context docBase="dreamlive" path="

/ROOT" reloadable="true" crossContext="true" source="org.eclipse.jst.jee.server:dreamlive"/>


 

这行代码,在你部署新项目的时候,docBase和source会随着改变,现在还是热部署的状态,这样每次更改class文件都会自动的去编译,比较耗时,接下来我们更改一下配置:


 代码如下:

<Context docBase="dreamlive" path="

/ROOT" reloadable="false"

 crossContext="true"

source="org.eclipse.jst.jee.server:dreamlive"

/></Host>


 

 

这里将reloadable改为false,添加crossContext="true",这样就能进行 热启动 了,注意:需要用debug启动

不过我们需要在每次部署新项目的时候,重新去更改这个配置,我们可以观察每次部署新项目的时候,server.xml这个文件的动态变化,设置完成之后如果启动项目热加载并没有生效,那么勾选eclipse-->project-->Build Automatically,加上自动编译。

下面附上每个属性的含义

path 指出你的访问路


docBase指出你的存放路径


debug 为设定debug的等级0提供最少的信息,9提供最多的信息


reloadable=true时 当web.xml或者class有改动的时候都会自动重新加载不需要从新启动服务


crosscontext="true"表示配置的不同context共享一个session(可以不配置)

 

二、Tomcat配置热启动

具体方法如下:


第一步: Tomcat安装目录下,修改 conf/server.xml 中的 Host 配置,设置其reloadable属性为true,即在Host标签中添加reloadable="true"这一句,重启Tomcat使配置文件生效。


第二步:在conf文件夹中的web.xml文件中添加

 

<init-param>

 <param-name>development</param-name>

 <param-value>true</param-value>

</init-param>


第三步:重启tomcat服务器,使修改生效。

 

小结:

不过我们需要在每次部署新项目的时候,重新去更改这个配置,我们可以观察每次部署新项目的时候,server.xml这个文件的动态变化,设置完成之后如果启动项目热加载并没有生效,那么勾选eclipse-->project-->Build Automatically,加上自动编译。

下面附上每个属性的含义  
  path 指出你的访问路
  docBase指出你的存放路径
  debug 为设定debug的等级0提供最少的信息,9提供最多的信息
  reloadable=true时 当web.xml或者class有改动的时候都会自动重新加载不需要从新启动服务
  crosscontext="true"表示配置的不同context共享一个session(可以不配置)