乐趣区

Spring-loaded实现热部署-开发环境

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

获取 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 的路径按实际填写

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

eclipse 中
右击项目 ->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 了

退出移动版