Oracle提供的JDK其实已经自带一定程度的热加载功能,但是如果你修改了类名,方法名,或者添加了新类,新方法的话。Tomcat都需要重新启动来使得刚才的更改生效。而JRebel和spring-loaded都能有效地解决这个问题。其中springloaded是开源软件,可以免费使用。其主页:https://github.com/spring-projects/spring-loaded

获取jar包

首先我们需要得到spring-loaded的jar包,上面的github链接中可以下载到。这里我用的是最新的springloaded-1.2.7.RELEASE.jar

存放位置:D:\springloaded-1.2.7.RELEASE.jar

IDE中部署

打开项目,在启动之前按以下进行配置

idea中

在启动Tomcat之前配置VM option。填写以下参数:

​ -javaagent:D:/springloaded-1.2.7.RELEASE.jar -noverify

其中参数中Springloaded的路径按实际填写

Markdown

配置完成后可以启动项目了


eclipse中

右击项目->Run as->Run configurations… 在tomcat启动项添加VM参数

​ -javaagent:D:/springloaded-1.2.7.RELEASE.jar -noverify

其中参数中Springloaded的路径按实际填写

Markdown

配置完成后可以启动项目了

测试

为了解Springloaded 适用于哪些更改,下面来作几个测试


我在上述启动的SSM项目中,在一个控制器里添加了以下方法

1
2
3
4
5
6
7
8
/**
* 测试SpringLoaded
*/
@RequestMapping("/hello")
@ResponseBody
public String test(){
return "Hello Spring Loaded!";
}

保存后通过浏览器访问失败,找不到/hello 这个路径。通过重启Tomcat后可以正常访问test方法


继续添加test2()方法,不使用注解,为了在浏览器中方便测试,通过test()方法来访问test2()方法。(经过上面重启Tomcat后test方法可以访问)

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 测试SpringLoaded
*/
@RequestMapping("/hello")
@ResponseBody
public String test(){
return this.test2();
}

public String test2(){
return "Spring Loaded By Test2";
}

浏览器输出

​ “Spring Loaded By Test2”

说明我们添加的第二个方法test2()没有经过重启服务器就可以访问了,热部署生效


我们继续 新建一个类,并在test()方法中去调用

1
2
3
4
5
6
7
8
9
10
11
/**新建类
* Created by JiangWei.Huang
* 2017/8/22 0022.
*/
@RestController
public class TestCtrl {
@GetMapping("/hello3")
public String test3(){
return "TestCtrl-test3";
}
}
1
2
3
4
5
6
7
8
9
/**修改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自动编译,设置如下图。

Markdown

总结

经过上面的测试我们可以得出一些结论。像官方所说,可以实现以下的热更新

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了