首页 > 编程笔记

spring-boot-devtools(开发者工具)的整合和使用

Spring Boot 给开发人员带来了快速、便捷的开发体验。为了让这一体验能更进一步,Spring 还发布了开发者工具 spring-boot-devtools。该工具解决了开发过程中将会遇到的一些烦琐问题,让开发人员能更好地关注程序开发本身。

整合spring-boot-devtools

在项目中整合 spring-boot-devtools 与添加其他 Spring Boot 模块一样简单。加入以下依赖即可:
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>sprring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

注意:spring-boot-devtools 所带来的优化均针对开发以及测试环境。在这些环境上运行的、所需要具备的条件与在生产环境上存在差异。因此,在为生产环境提供软件包时,务必将该依赖排除在外。

Spring Boot 团队对此做了一些工作,比如在运行“完全打包”的应用程序时,spring-boot-devtools 将会被禁用。“完全打包”的应用程序指的是使用java -jar 命令启动的,或者使用特殊的类加载器启动的程序。在依赖中设置“optional”为 true 是 Spring Boot 团队认定的“最佳实践”。

除此之外,也可以借助 maven profile 功能,将开发环境的依赖项与生产环境的依赖项区分开来。

自动配置

Spring Boot 为了提高程序在生产环境下的性能,内置了诸多配置,比如默认情况下会启用缓存以提高性能。像是模板引擎中就用到了这样的优化方式,但是在开发环境中,尽快地查看到修改结果相对而言更为重要。

通常会通过在 application.properties 中添加配置 spring.thymeleaf.cache=false 为 thymeleaf禁用默认的缓存。在引入开发者工具 spring-boot-devtools 之后,这些操作将由工具帮助开发人员自动完成。

热部署

在日常开发过程中一定会碰到修改程序并重启的情况。如果依赖项过多导致加载依赖项非常耗时,那么频繁的重启会浪费掉很多时间。spring-boot-devtools 为了解决这个问题带来了“热部署”功能,该功能可以实现应用程序的快速重启。

spring-boot-devtools 将会为应用创建两个类加载器,分别是加载不变类(例如来自第三方 jar 的类)的基础类加载器和加载可变类(当前正在开发的类)的重启类加载器。每当重启时,将丢弃重启类加载器,并创建一个新的类加载器。这种方式相较于应用平时使用的“冷启动”要快得多,毕竟基础类加载器已经处于可用的状态。

spring-boot-devtools 的热部署功能将监听当前项目的 classpath,如果 classpath 上有文件更改,热部署将被激活,程序随之自动重启。要流畅使用该功能还需要对 IDE 做一些配置使 IDE 可用,在修改过后进行自动编译。以 IDEA 为例,流程如下:

(1)开启自动编译项目,路径为“File”→“Settings”→“Build,Ex-ecution,Deployment”→“compiler”,如图 1 所示。
图1   开启自动构建项目 
图1 开启自动构建项目

(2)使用快捷键“Shift+Ctrl+A”激活 Find Action 搜索框。

(3)在搜索框中输入 Registry,并单击搜索到的 Registry 选项,如图 2 所示。
图2 搜索Registry
图2 搜索Registry

(4)在 Registry 弹出框中搜索属性“compiler.automake.allow.when.app.running”,并勾选,如图 3 所示。
图3 勾选compiler.automake.allow.when.app.running
图3 勾选compiler.automake.allow.when.app.running

事实上,并不总是需要在文件更改之后重新启动程序,比如一些静态文件。例如模板、CSS、二进制文件这样的静态文件可以通过 LiveReload 功能实现快速更改。因此可以在配置中,将这部分文件所在路径从重启的监听路径中排除。配置示例如下:

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

可以将特定路径排除在监听的范围,也可以将另外的特定路径加入到监听的范围内。将附加的路径加入到监听范围内的配置项为:

 spring.devtools.restart.additional-paths

LiveReload插件支持静态资源的及时更新

spring-boot-devtools 内包含一个嵌入式 LiveReload 服务器,该服务器用于静态资源更改后的更新。要使用该功能,需要另外在浏览器中获取支持该功能的 LiveReload 插件。

如果不需要启用 LiveReload 服务器,可以在 application.properties 中加入以下配置:

spring.devtools.livereload.enabled=false

全局配置

spring-boot-devtools 支持在计算机中设置一个全局配置。该配置的内容将应用于当前计算机所有启用了 devtools 的 Spring Boot 应用程序。配置路径为$HOME 文件夹下的 .spring-boot-devtools.properties 文件。Windows 用户使用该功能,或许需要另外设置环境变量 HOME。

远程应用

spring-boot-devtools 提供了开箱即用的远程调试功能,要使用该功能,需要将 spring-boot-devtools 打包为程序的一部分。可以通过 maven 插件中的excludeDevtools 配置来实现:
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupld>
            <artifactId>spring-boot-maven-plugin</artifactld〉
            <configuration>
                <excludeDevtools>false</excludeDevtools>
            </configuration>
        </plugin>
    </plugins>
</build>
为了使通过 HTTP 的远程调用生效,需要执行以下步骤:

(1)在启动服务端程序的时候添加以下参数

-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n

(2)在本地IDE中,打开启动配置,填入以下内容


如图 4 所示。
图4 配置远程应用
图4 配置远程应用

(3)启动主类为RemoteSpringApplication的启动项,以启用远程应用客户端

完成远程应用客户端的启动过后,可以实现远程自动更新(与本地热部署类似)。本地项目的改动将会由远程应用客户端推送给服务端程序,并自动完成更新。另外还可以通过该启动项实现远程调试,步骤与本地调试类似。

远程调试的默认端口为8000,可以使用以下配置对其进行更改:

spring.devtools.remote.debug.local-port=8010

另外,为保证程序的安全性,还可以使用以下配置为远程应用设置秘钥:

spring.devtools.remote.secret=mysecrt

优秀文章