进行springboot的web开发过程中,我们很多时候经常需要重启web服务器才能保证修改的源代码文件、或者诸如xml的配置文件、以及一些静态文件生效,这样耗时又低效。我们可以采用热部署的方式解决此类问题。热部署是指我们不需要重启web server就可以保证各项文件修改的立即生效。
springboot有三种实现热部署方式:
1. 使用springloaded配置pom.xml文件,使用mvn spring-boot:run启动
2. 使用springloaded本地加载启动,配置jvm参数
-javaagent:<jar包地址> -noverify
3. 使用devtool工具包,操作简单,但是每次需要重新部署
第一种:
1. 原来的pom.xml文件中添加如下配置
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
注意:需要在spring-boot-maven-plugin中添加dependency
2. 启动方式变为maven启动
在项目文件夹dos窗口输入命令:mvn spring-boot:run
注意:停止服务只能使用ctrl+c,如果设置后台启动,需要kill进程
第二种:
1. 第二种和第一种采用的同样方式,不过需要将spring-loaded下载下来,
将下面这局代码放到VM arguments中,如图:
-javaagent:D:\maven_jar\springloaded-1.2.8.RELEASE.jar -noverify
注意:红色字为你的jar包所在位置
解释: -javaagent:命令后面跟冒号,意为是在执行main方法之前执行特定代码
-noverify关闭java字节码校验功能
然后直接run启动就行了。
第三种:
1. 在pom.xml中添加一个热部署依赖,
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
启动项目即可。
小结:
在开发测试环境下可取第三种,方便快捷。
在生产环境下,建议使用第二种,使用脚本启动。
springboot实现热部署的原理:
深层原理是使用了两个ClassLoader,一个ClassLoader加载那些不会改变的类(第三方jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader ,这样在有代码更改的时候,原来的restart ClassLoader被丢弃,重新建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
如有不足,欢迎留言指正,望不吝赐教。。。