8

Developer Tools

spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去,即在我们改变了一些代码或者配置文件的时候,应用可以自动重启,这在我们开发的时候,非常有用。
要包含devtools支持,需要将spring-boot-devtools模块依赖添加到项目构建中,如Maven和Gradle的以下列表所示:
Maven依赖:

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

运行完整打包的应用程序时,Developer tools会自动禁用。如果应用以java -jar方式启动或特殊的类加载器,应用会被视为"production application"。在Maven中将依赖标记为optional是防止devtools 被应用于使用你工程的其他模块的最佳实践。
打包应用默认不会包含devtools。

属性默认值

Spring Boot支持的一些库使用缓存来提高性能。例如,模板引擎缓存已编译的模板以避免重复解析模板文件。另外,Spring MVC可以在服务静态资源时将HTTP缓存头添加到响应中。

虽然缓存在生产中非常有用,但它在开发过程中会起到反作用,使我们无法看到在应用程序中所做的更改。因此,spring-boot-devtools默认禁用缓存选项

缓存选项通常由application.properties文件中的设置进行配置。例如,如要禁用Thymeleaf的缓存功能可以配置spring.thymeleaf.cache为false。引入spring-boot-devtools模块后不需要手动设置这些属性,spring-boot自动应用合理的开发时配置。
有关devtools自动应用的属性的完整列表,可参阅 DevToolsPropertyDefaultsPostProcessor

以下是DevToolsPropertyDefaultsPostProcessor的部分源码:

@Order(Ordered.LOWEST_PRECEDENCE)
public class DevToolsPropertyDefaultsPostProcessor implements EnvironmentPostProcessor {

    private static final Map<String, Object> PROPERTIES;

    static {
        Map<String, Object> devToolsProperties = new HashMap<>();
        devToolsProperties.put("spring.thymeleaf.cache", "false");
        devToolsProperties.put("spring.freemarker.cache", "false");
        devToolsProperties.put("spring.groovy.template.cache", "false");
        devToolsProperties.put("spring.mustache.cache", "false");
        devToolsProperties.put("server.servlet.session.persistent", "true");
        devToolsProperties.put("spring.h2.console.enabled", "true");
        devToolsProperties.put("spring.resources.cache.period", "0");
        devToolsProperties.put("spring.resources.chain.cache", "false");
        devToolsProperties.put("spring.template.provider.cache", "false");
        devToolsProperties.put("spring.mvc.log-resolved-exception", "true");
        devToolsProperties.put("server.servlet.jsp.init-parameters.development", "true");
        devToolsProperties.put("spring.reactor.stacktrace-mode.enabled", "true");
        PROPERTIES = Collections.unmodifiableMap(devToolsProperties);
    }

自动重启

当类路径上的文件发生更改时,使用spring-boot-devtools的应用程序会自动重新启。在IDE中工作时,这是一个非常有用的功能,因为它为代码更改提供了非常快速的反馈。

触发重启
由于DevTools监控类路径资源,触发重启的唯一方法是更新类路径。导致类路径更新的方式取决于您使用的IDE。在Eclipse中,保存修改后的文件会导致更新类路径并触发重新启动。在IntelliJ IDEA中,构建项目(Build -> Build Project)具有相同的效果,但实际开发中不可能每次改动后都手动Build,因此需要设置Idea的自动编译。
File --> Settings --> Compiler --> Build Project automatically

clipboard.png

ctrl + shift + alt + / --> Registry --> Compiler autoMake allow when app running

clipboard.png

clipboard.png

重新启动 vs 重新加载

Spring Boot提供的重启技术通过使用两个类加载器来工作。不改变的类(例如来自第三方jar的类)被加载到base classloader中。我们正在开发的类会加载到restart classloader中。当应用程序重新启动时,restart classloader将被丢弃并创建一个新类。这种方法意味着应用程序重启通常比"cold starts"快得多,因为基类加载器已经可用并且已经被填充。

排除的资源

某些资源不一定需要在更改时触发重新启动。例如,可以就地编辑Thymeleaf模板。默认情况下,在改变资源/META-INF/maven,/META-INF/resources,/resources,/static,/public,或 /templates不会触发重启但并触发 重新加载。可以使用spring.devtools.restart.exclude属性来自定义排除的资源。例如,要仅排除/static,/public可以设置以下属性:

spring.devtools.restart.exclude=static/**,public/**

监控其他路径
如上所述,DevTools监控类路径资源的变动,但如果我们想更改不在类路径中的文件时重新启动或重新加载应用程序,该怎么办呢?这是可以使用spring.devtools.restart.additional-paths属性来配置其他路径以监视更改。

Spring Loaded

Spring Boot项目热部署方式还有一种就是使用spring loaded。
在spring-boot-maven-plugin中添加springloaded依赖

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
            <version>1.2.6.RELEASE</version>
        </dependency>
    </dependencies>
</plugin>

项目以mvn spring-boot:run方式启动即可完成热部署
再就是不添加依赖,直接将springloaded jar包下载下来,然后以java应用方式启动,只不过要配置一下Run Configuration将VM options配置为-javaagent:C:springloaded-1.2.6.RELEASE.jar -noverify(其中C:springloaded-1.2.6.RELEASE.jar为你自己jar所在位置)

clipboard.png


计算机小白
43 声望4 粉丝