问题的提出: 在编写代码的时候,你会发现我们只是简单把打印信息改变了,就需要重新部署,如果是这样的编码方式,那么我们估计一天下来就真的是打几个Hello World就下班了。那么如何解决热部署的问题呢?那就是springloaded
运行方法一
使用spring-boot:run
使用方式一
在pom.xml文件添加依赖包:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin </artifactId>
<dependencies>
<!--springloaded hot deploy -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
运行方法二
如果使用的run as – java application的话,那么还需要做一些处理。 把spring-loader-1.2.4.RELEASE.jar下载下来,放到项目的lib目录中,然后把IDEA的run参数里VM参数设置为: -javaagent:.\lib\springloaded-1.2.4.RELEASE.jar -noverify 然后启动就可以了,这样在run as的时候,也能进行热部署
springboot + devtools(热部署)
问题的提出: 通过使用springloaded进行热部署,但是些代码修改了,并不会进行热部署。
spring-boot-devtools
1、
spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间。
2、
其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为 restart ClassLoader
3、
这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间(5秒以内)。
使用方法二:
热部署重要的是:添加一个jar包
第一步:在我们项目中的pom.xml文件中添加spring-boot-devtools这个jar包,Maven会帮我们自动下载的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional><!--项目不支持传递,子项目不支持热部署-->
<scope>true</scope><!--必须添加,否则无法生效-->
<version>1.5.6.RELEASE</version>
</dependency>
在pom.xml下面添加中间那项配置configuration
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork><!--还需要添加此配置-->
</configuration>
</plugin>
</plugins>
</build>
再给讲解一些热部署的这个工具的作用机制:(网上看到的感觉说的很在理)
devtools:是boot的一个热部署工具,当我们修改了classpath下的文件(包括类文件、属性文件、页面等)时,会重新启动应用(由于其采用的双类加载器机制,这个启动会非常快,如果发现这个启动比较慢,可以选择使用jrebel)
- 双类加载器机制:boot使用了两个类加载器来实现重启(restart)机制:base类加载器(简称bc)+restart类加载器(简称rc)。
- bc:用于加载不会改变的jar(eg.第三方依赖的jar)
- rc:用于加载我们正在开发的jar(eg.整个项目里我们自己编写的类)。当应用重启后,原先的rc被丢掉、重新new一个rc来加载这些修改过的东西,而bc却不需要动一下。这就是devtools重启速度快的原因。
第二步:要在IDEA中设置一些属性
这个是实现项目的自动编译
接下来按快捷键alt+shift+ctrl+/ 出现选择第一个registry,之后在里面找到下图中的这个running选择打勾
在你的这个下选择Edit congfiguration
你的左侧没有Maven的话,就选择+号,添加Maven
在command line:写spring-boot:run
Name:是取个名字你认识就可以
就这样热部署完毕
用你的spring-boot:run重新启动一下项目,修改一下你你的Controller中的方法的一些代码,看看你的控制台是否变化,就可以看出来你是否有部署好你的热部署
在你的浏览器上试试
测试方法
修改类-->保存:应用会重启
修改配置文件-->保存:应用会重启
修改页面-->保存:应用会重启,页面会刷新(原理是将spring.thymeleaf.cache设为false)
三、不能使用分析
对应的spring-boot版本是否正确, 是否加入plugin以及属性<fork>true</fork> Eclipse Project 是否开启了Build Automatically(我自己就在这里栽了坑,不知道为什么我的工具什么时候关闭了自动编译的功能)。 如果设置SpringApplication.setRegisterShutdownHook(false),则自动重启将不起作用。
参考: