基于spring-loaded的热部署

JDK1.5之后提供了java.lang.instrument.Instrumentation,即java agent机制能够实现类的redefinition和retransform,它能够实现类的热替换,但遗憾的是功能很有限。
为工作需要,最近在研究热部署实现,遇到一个开源项目spring-loaded,看了下官方的介绍文档:发现它功能比JDK自带的强大多了。
经过自己的尝试,发现使用spring-loaded项目,它是基于javaAgent实现的一个代理,确实可以实现java应用的热部署。下面介绍下如何将spring-loaded引入到项目中。我们可以运行下面的这段代码,然后修改A.say()方法,看看在不重启JVM的情况下,是否能够动态改变。
public class SpringLoadTest
{
public static void main(String[] args) throws Exception
{
SpringLoadTest test = new SpringLoadTest();

while (true)
{
test .say();
Thread.sleep(3000);
}
}
public void say(){
System.out.println(“spring-loaded testing ...”);
}
}
为了使用spring-loaded实现热部署,我们只需要在启动JVM的时候,增加如下的启动参数即可-javaagent:springloaded-1.2.5.RELEASE.jar -noverify
如果是通过eclipse启动,那么可以在run confiuration中进行设置,如下图:
如果是通过eclipse启动,那么可以在run confiuration中进行设置 
接下来我们看下如何在tomcat中使用spring-loaded实现war包的热部署。将下载的springloaded-1.2.5.RELEASE.jar放到%TOMCAT_HOME%/bin/目录下,然后修改该目录下的catalina.bat

set JAVA_OPTS=-javaagent:springloaded-1.2.5.RELEASE.jar -noverify

这样就完成了spring-loaded在tomcat下配置,能够检测tomcat下部署的web应用,在不重启tomcat的情况下,实现应用的热部署。
接下来我们看下如何在resin中使用spring-loaded实现war包的热部署。将下载的springloaded-1.2.5.RELEASE.jar放到%RESIN_HOME%/lib/目录下,然后修改resin配置目录下的resin.xml,在<server-default>中添加如下配置:
<jvm-arg>-javaagent:springloaded-1.2.5.RELEASE.jar</jvm-arg>
<jvm-arg>-noverify</jvm-arg>
这样就完成了spring-loaded在resin下的配置,能够检测resin下部署的web应用,在不重启resin的情况下,实现应用的热部署。
注意如果出现Error opening zip file or jar manifest missing:
javaagent:springloaded-1.2.5.RELEASE.jar
可以将此处改为jar的绝对路径即可。
目前最新版本的jar包正是springloaded-1.2.5.RELEASE.jar下载方式如下:
外网可到github获取最新版
https://github.com/spring-projects/spring-loaded

猜你喜欢

转载自zxmsammy.iteye.com/blog/2344163
今日推荐