Spring Loaded
与spring-boot-devtools的restart不同,Spring Loaded是reload,它会监控classpath下的文件,只要发生改变,就会reload这个文件,无论是class还是资源文件。
注意点1:就是classpath路径下不能有中文,不能有空格,举个例子,在windows上D:\My Project\demo\target\classes 就是绝对错误的典范,笔者在这上面吃了很大的亏,花了很长时间才找到这个错误,路径一定要是stander一点的路径形式
注意点2:如下java文件,你不管则么修改,不管是用Spring Loaded还是JRebel都是一样的无法reload的,reload是class级别的
public class Main {
public static void main(String[] args) {
while (true) {
System.out.println("test");
Thread.sleep(1000);
}
}
}
改成如下,就可以了,修改
System.out.println("p31" + name);
或者A
中的其他任何地方都没问题,都会reload
public class Main { static class A { String name = "test"; void p() { System.out.println("p31" + name); } } public static void main(String[] args) throws InterruptedException { A a = new A(); while (true) { a.p(); Thread.sleep(1000); } } }
使用Spring Loaded
非IDE模式(所有java项目)
去maven中心下载spring loaded的jar包,版本越新越稳定,因为早期版本reload功能bug很多,去github该项目的issue下看看就知道了 笔者当前最新是1.2.8.RELEASE
在执行java程序时,如下:
java -javaagent:<pathTo>/springloaded-{VERSION}.jar -noverify SomeJavaClass
<pathTo>/springloaded-{VERSION}.jar
是你存放springloaded jar的路径,如果是在windows下,要注意反斜杠
,要写成这样-javaagent:D:\\Tools\\springloaded-1.2.8.RELEASE.jar -noverify
然后就可以爽了
maven模式(所有java项目)
- 下载springloaded jar
- 在maven所在目录的bin目录下,修改mvn.cmd或是mvn.bat或者mvn.sh之类的,就是maven得启动脚本,加上参数
MAVEN_OPTS=-javaagent:<pathTo>/springloaded-{VERSION}.jar -noverify
,其实原理是一样的,就是给jvm启动时加上此vm参数 - 使用
mvn exec:java -Dexec.mainClass="SomeJavaClass"
运行
maven模式,使用spring-boot-maven-plugin(spring-boot项目)
- 修改pom
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin </artifactId> <dependencies> <!--在这里添加 springloader plugin --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.8.RELEASE</version> </dependency> </dependencies> </plugin>
- 运行时,使用
mvn spring-boot:run
,就是采用spring-boot-maven-plugin的方式运行spring-boot应用
IDE模式
无论IDEA还是eclipse,打开main 的run configuration,在vm参数里加上java -javaagent:<pathTo>/springloaded-{VERSION}.jar -noverify
,一样的,万变不离其宗,IDE使用run java application方式启动其实就是,自动执行java -cp xxx SomeJavaClass
,所以加上需要的vm参数就ok了