对于Java应用程序来说,热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色。大多数基于Java的应用服务器,包括EJB服务器和Servlet容器,都支持热部署。类装入器不能重新装入一个已经装入的类,但只要使用一个新的类装入器实例,就可以将类再次装入一个正在运行的应用程序。
一、热部署介绍
热部署对于程序开发的好处就不用多说了,这里记录一下自己的使用过程:
1.myeclipse的年代,那时候通过myeclipse新建的web项目,通过debug方式启动,可以获得修改java类中的方法体和jsp页面立即生效的功能;这是纯eclipse所没有的。
2.后来出了jrebel可以获得新增java类和方法也无需重启应用服务器即可生效的功能,当然这个功能不完美,有缺陷。
3.随着eclipse的升级,推出了Jee版本的eclipse,也就逐渐淘汰了myeclipse,但是JEE版本的eclipse和tomcat配合,即便使用debug模式启动,修改java类还是会导致整个应用的重新加载,这是不能忍受的,这时候,发现了jetty配合JEE版本的 eclipse可以完美的实现热加载,即改即用,很方便。
二、热部署过程
先做个说明,没有热部署和有热部署的开发效率真是天差地别的。所以热部署受很多第三方软件包(Struts,Spring,Hibernate)的限制。本来可以热部署的,加入了第三方的包就不可以了。所以,先说明详细的软件环境,和程序配置是非常必要的。
虚拟机:java Tomcat Eclipse Myeclipse
应用程序情况:纯正的sertlet+jsp+javabean,数据库连接使用JDBC-ODBC桥连接Access数据库。没有使用任何第三方软件包,没有使用Struts,Spring,Hibernate.\WebRoot\WEB-INF\lib下是空的。
配置方法:
ie登陆http://Tomcat所在的服务器IP:8080/ →点超连接“Tomcat Administration”→ 输入用户名密码登陆→在左侧的功能树中→Tomcat Server→Service(Catalina)→Host(localhost)→Context(/要修改的web项目)→右侧新出现的页面中 →Reloadable设置为true→Save按钮→Commit Changes.
开发时,修改。java文件后,调用这个类时日志提示:
- Reloading this Context has started
这是正在重新加载修改后的。class文件。
j2ee开发插件(这里使用Myeclipse),也可能导致热部署失效。因为插件必须要把编译好的。class文件从工作空间复制到Tomcat\webapps下的项目里。才能使Tomcat得到需要热部署的文件。
最后说一下jreble,网上的资料比较复杂,下面介绍个最简单的方法:
在resin的启动文件,例如httpd.sh中增加:
Resin 3.1+版本:#div_code img{border:0px;} exec $JAVA_EXE -javaagent:/opt/apps/resin/jrebel4.0-crack.jar -jar ${RESIN_HOME}/lib/resin.jar $*
Resin 3.0-版本:#div_code img{border:0px;} args=“-J-javaagent:/opt/apps/resin/jrebel4.0-crack.jar”
三、小结
在进行java web程序开发过程中,经常遇到这种问题,修改一个java文件(*.java),需要重启web服务器(如tomcat,weblogic等),部署项目。而起/停服务器浪费了大量的时间。在小项目中,也许我们感觉不到。但对于公司的大型项目:如数据中心,生产等系统开发而言,往往起/停需要等待几分钟时间。更浪费时间的是,对于一个类中的方法的调试过程,如果修改多次,需要反复的启停服务器,那么浪费的时间更多。从上可以看出,我们急需一个可快速起/ 停服务器的工具,来提高我们的开发效率。