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项目,确实可以实现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中进行设置
接下来我们看下如何在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的情况下,实现应用的热部署。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。