0
点赞
收藏
分享

微信扫一扫

Spring Loaded is a JVM agent for reloading class file changes

 

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
</dependencies>
</plugin>

 

JDK1.5之后提供了java.lang.instrument.Instrumentation,即java agent机制能够实现类的redefinition和retransform。

redefinition对应Instrumentation.redefineClasses()能够实现类的热替换,但遗憾的是功能很有限。


​​The redefinition may change method bodies, the constant pool and attributes.​​
​​The redefinition must not add, remove or rename fields or methods, change the ​​
​​signatures of methods, or change inheritance. These restrictions maybe be​​
​​lifted in future versions.​​


最近遇到一个开源项目spring-loaded,看了下官方的介绍文档:发现它功能比JDK自带的强大多了。

Spring Loaded is a JVM agent for reloading class file changes whilst a JVM is running. It transforms classes at loadtime to make them amenable to later reloading. Unlike 'hot code replace' which only allows simple changes once a JVM is running (e.g. changes to method bodies), Spring Loaded allows you to add/modify/delete methods/fields/constructors. The annotations on types/methods/fields/constructors can also be modified and it is possible to add/remove/change values in enum types.

Spring Loaded is usable on any bytecode that may run on a JVM, and is actually the reloading system used in Grails 2.

​​https://github.com/spring-projects/spring-loaded​​

经过自己的尝试,发现使用spring-loaded项目,确实可以实现java应用的热部署。下面介绍下如何将spring-loaded引入到项目中。我们可以运行下面的这段代码,然后修改A.say()方法,看看在不重启JVM的情况下,是否能够动态改变。

​​package​​​ ​​test;​​

​​import​​​ ​​demo.A;​​

​​public​​​ ​​class​​​ ​​TestPreMain​​
​​{​​

​​// -javaagent:springloaded-1.2.0.RELEASE.jar -noverify​​
​​public​​​ ​​static​​​ ​​void​​​ ​​main(String[] args) ​​​​throws​​​ ​​Exception​​
​​{​​

​​A a = ​​​​new​​​ ​​A();​​

​​while​​​ ​​(​​​​true​​​​)​​
​​{​​
​​a.say();​​
​​Thread.sleep(​​​​3000​​​​);​​
​​}​​
​​}​​
​​}​​

为了使用spring-loaded实现热部署,我们只需要在启动JVM的时候,增加如下的启动参数即可

​​-javaagent:springloaded-​​​​1.2​​​​.​​​​0​​​​.RELEASE.jar -noverify​​

如果是通过eclipse启动,那么可以在run confiuration中进行设置 

Spring Loaded is a JVM agent for reloading class file changes_java

 

接下来我们看下如何在tomcat中使用spring-loaded实现war包的热部署。将下载的springloaded-1.2.0.RELEASE.jar放到%TOMCAT_HOME%/bin/目录下,然后修改该目录下的catalina.bat


​​set JAVA_OPTS=-javaagent:springloaded-​​​​1.2​​​​.​​​​0​​​​.RELEASE.jar -noverify​​

这样就完成了spring-loaded的安装,能够检测tomcat下部署的webapp,在不重启tomcat的情况下,实现应用的热部署。 

​​http://www.2cto.com/kf/201411/348927.html​​

当然,它也有一些小缺限: 
1. 目前官方提供的1.2.4 版本在linux上可以很好的运行,但在windows还存在bug,官网已经有人提出:​​​https://github.com/spring-projects/spring-loaded/issues/145​​​ 
2. 对于一些第三方框架的注解的修改,不能自动加载,比如:spring mvc的@RequestMapping 
3. log4j的配置文件的修改不能即时生效。


<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
</dependencies>
</plugin>



举报

相关推荐

0 条评论