Spring Boot――热部署的两种部署方式

 

问题的提出: 在编写代码的时候,你会发现我们只是简单把打印信息改变了,就需要重新部署,如果是这样的编码方式,那么我们估计一天下来就真的是打几个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),则自动重启将不起作用。

参考:

http://www.cnblogs.com/zhouguanglin/p/7512183.html

http://www.cnblogs.com/a8457013/p/8065489.html

猜你喜欢

转载自blog.csdn.net/qq_37939251/article/details/83964061