Oracle提供的JDK其实已经自带一定程度的热加载功能,但是如果你修改了类名,方法名,或者添加了新类,新方法的话。Tomcat都需要重新启动来使得刚才的更改生效。而JRebel和spring-loaded都能有效地解决这个问题。其中springloaded是开源软件,可以免费使用。其主页:https://github.com/spring-projects/spring-loaded
首先我们需要得到spring-loaded的jar包,上面的github链接中可以下载到。这里我用的是最新的springloaded-1.2.7.RELEASE.jar
存放位置:D:\springloaded-1.2.7.RELEASE.jar
打开项目,在启动之前按以下进行配置
在启动Tomcat之前配置VM option。填写以下参数:
-javaagent:D:/springloaded-1.2.7.RELEASE.jar -noverify
其中参数中Springloaded的路径按实际填写
配置完成后可以启动项目了
右击项目->Run as->Run configurations… 在tomcat启动项添加VM参数
-javaagent:D:/springloaded-1.2.7.RELEASE.jar -noverify
其中参数中Springloaded的路径按实际填写
配置完成后可以启动项目了
为了解Springloaded 适用于哪些更改,下面来作几个测试
我在上述启动的SSM项目中,在一个控制器里添加了以下方法
/**
* 测试SpringLoaded
*/
@RequestMapping("/hello")
@ResponseBody
public String test(){
return "Hello Spring Loaded!";
}
保存后通过浏览器访问失败,找不到/hello 这个路径。通过重启Tomcat后可以正常访问test方法
继续添加test2()方法,不使用注解,为了在浏览器中方便测试,通过test()方法来访问test2()方法。(经过上面重启Tomcat后test方法可以访问)
/**
* 测试SpringLoaded
*/
@RequestMapping("/hello")
@ResponseBody
public String test(){
return this.test2();
}
public String test2(){
return "Spring Loaded By Test2";
}
浏览器输出
“Spring Loaded By Test2”
说明我们添加的第二个方法test2()没有经过重启服务器就可以访问了,热部署生效
我们继续 新建一个类,并在test()方法中去调用
/**新建类
* Created by JiangWei.Huang
* 2017/8/22 0022.
*/
@RestController
public class TestCtrl {
@GetMapping("/hello3")
public String test3(){
return "TestCtrl-test3";
}
}
/**修改test方法调用新建的类TestCtr中的test3方法
* 测试SpringLoaded
*/
@RequestMapping("/hello")
@ResponseBody
public String test(){
TestCtrl testCtrl = new TestCtrl();
return testCtrl.test3();
}
浏览器输出
“TestCtrl-test3”
说明我们新建的类,在不用重启的情况下也能够被调用到了,热部署生效
但值得注意的是,我们新建的类中,在类上与方法上都写了Spring注解,但这里是也不生效的。@RestController这个注解没有生效,/hello3这个路径也是访问不了的。需要重启服务器才生效
另外在Idea中修改后自动保存但不会自动重新编译,如果在Idea中修改后热部署没有生效,按ctrl+shift+f9重新编译。也可以设置Idea自动编译,设置如下图。
经过上面的测试我们可以得出一些结论。像官方所说,可以实现以下的热更新
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加载允许您添加/修改/删除/字段/方法构造函数。注释类型/方法/字段/构造函数,并且还可以在枚举类型中添加/删除/更改值。
但是对于第三方像是Spring注解这些的修改,spring-loaded就无能为力了,必须求助于更加强大的,收费的JRebel了