spring-boot-devtools

Posted Happy2Share

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring-boot-devtools相关的知识,希望对你有一定的参考价值。

Create a new Maven Project  and  we have two class under the package com.example.demo like below screen shot.

This page mainly focus on how to make the change you make ready to show the result without restarting  spring boot application manually.

 

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @RequestMapping(value = "hi" , method = RequestMethod.GET)
    public String sayHi() {
        return "Hello World!";
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

Then,run the DemoApplication as Java Application or Spring Boot App (if you are using STS),after the application starts up,input the link localhost:8080/hi ,you will get the Hello World! as the output.

But when you want to change the RequestMapping from "hi" to "hello" ,to make it ready to use you need to change it and restart the application.

with spring-boot-devtools we just change the code and save it without restart the application manually,spring boot help us restart the application .

To achieve this , all you need to do are adding  the spring-boot-devtools dependency in the pom.xml and make sure Project>build automatically is chosen in the IDE 

这里多了一个Optional选项,是为了防止将 devtools 依赖传递到其他模块中。当将应用打包运行后,devtools 会被自动禁用。

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

On the condition that you add the dependency in the pom.xml file and you don\'t choose the build automatically within the IDE(Eclipse or STS here),then when you change the the RequestMapping from "hi" to "hello" and save it,spring boot will not restart the application for you ,you have to bulid the pom file and restart the application manualy.Because the spring-boot-devtools monitor the code under the target to restart the application to make the change you made ready to use ,so you choose the build atuomatically and change RequestMapping and save it ,the IDE build and the code under the target is  updated to trigger the restart of the spring boot application automatically.

For more details,please refer the spring boot  devtools reference guide : http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html

 由于项目的编码是一个连续的过程,并不需要每改一行代码就重启项目。

此时,可以使用触发文件,在application.yml 中配置spring.devtools.restart.trigger 

 

 然后在src/main/resource 下创建 .trigger-file

 

 此时,当开发者修改代码时,不会重启项目;需要重启项目时,开发者需要在修改代码并保存之后,修改 .trigger-file, 项目就会重启。

如果项目没有改变,只是改变了 .trigger-file 文件,项目不会重启。

SpringBoot 中使用的自动重启技术涉及两个类加载器,一个是 baseclassloader, 用来加载不会变化的类,例如项目应用的第三方Jar 包;

另一个是 restartclassloader,用来加载开发者自己写的会变化的类。 

当改变自己写的代码项目需要重启时,restartclassloader 将被一个新创建的类加载器代替,而 baseclassloader 则继续使用原来的,这种启动方式要比冷启动快很多,因为  baseclassloader 已经存在并且已经加载好。

当改变POM 文件中的依赖,项目会重启,因为 baseclassloader 会重新加载所依赖的 Jar包。

 

以上是关于spring-boot-devtools的主要内容,如果未能解决你的问题,请参考以下文章

通过spring-boot-devtools在IDEA中实现热部署

spring-boot-devtools (springboot的热部署)

IDEA如何设置spring-boot-devtools即所见即所得

spring-boot-devtools 实现热部署

spring-boot-devtools热部署

spring-boot-devtools