[Spring Boot 系列教程] Dev Tools

上一篇文章中,介绍了 Spring Boot 的项目结构及自动构建机制,在本文中,将介绍 Spring Boot 开发者工具。

Spring Boot 中包含一组额外的工具 spring-boot-devtools,提供了一些在开发中非常有用的功能。

使用

在项目中添加 spring-boot-devtools 非常简单,只需要添加以下依赖项即可:

maven

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

gradle

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
}
dependencies {
    developmentOnly("org.springframework.boot:spring-boot-devtools")
}

因为 spring-boot-devtools 一般只使用于开发环境,在生产环境是需要禁用的,所以得设置 optional=true(maven) 或是 developmentOnly(gradle),这样一来,当我们在生产环境启动服务时(比如通过 java -jar 方式启动),spring-boot-devtools 会被禁用。同时,Repackaged 生成的包默认情况下也是不包含 devtools 的,如有需要,可以通过设置 excludeDevtoolsfalse 来启用它。

Dev Tools 的特性

默认属性

Spring Boot 为了支持某些库使用缓存来提高性能,提供了一些设置,如:spring.thymeleaf.cache,它将会缓存编译模板,避免因模板的重复解析而降低系统性能,这在生产环境中是非常重要的,但是在本地开发时,这会导致我们每次修改模板都要重启服务,大大降低了开发速度,为了避免这个问题,我们需要手动禁用 thymeleaf 缓存,但是如果你的项目中添加了 devtools ,那我们就不需要去一一设置这些选项了,devtools 为此提供了非常多的默认设置。

devtools 提供的所有默认选项请参考:DevToolsPropertyDefaultsPostProcessor

如果你需要禁用 devtools 提供的默认属性,请设置 spring.devtools.add-properties=false

自动重启服务

当项目 classpath 下的文件发生了变动,devtools 将会帮我们自动重启服务,这也是个非常有用的功能。

触发重启

因为 devtools 将会监控应用的 classpath 下的资源,因此当 classpath 下的资源发生了变更时,应用就会被重启。在 Eclipse 中,保存修改后的文件将会触发重启;在 Idea 中,构建项目(Build -> Build Project)将会导致应用重启。

但是有几点需要注意:

  • devtools 将会使用独立的类加载器。
  • devtools 依赖应用程序关闭钩子,如果你的应用禁用了关闭钩子(SpringApplication.setRegisterShutdownHook(false)),devtools 将会失效。
  • 在决定是否应该触发重启时,devtools 将会自动忽略名为 spring-bootspring-boot-devtoolsspring-boot-autoconfigurespring-boot-actuatorspring-boot-starter 的项目。

重启 vs 重新加载

Spring Boot 的重启和我们手动的重启有一些区别,因为 Spring Boot 将会使用两个类加载器来加载我们的应用,其中一个用于加载不会变更的类(如:第三方 jar) ,另外一个则用于加载我们开发的程序,在应用重新启动时,基本类加载器不会变,但是 Spring Boot 将会直接丢弃用于加载我们自己程序的类加载器,并重新创建一个类加载器加载变更后的应用,因为这样,这种方式启动应用将比普通方式启动更快,因为基础类已经被加载。

如果你觉得 Spring Boot 提供的重启还是不够快的话,可以尝试使用其它的基于 Reload 的技术,如 JRebel

条件评估结果日志

在默认情况下,每次重启时,Spring Boot 将会记录条件评估的结果报告。这个报告将会展示你的应用

auto-configuration 的变更(如增加或删除 Bean 以及配置属性的变更)。你也可以通过以下属性禁用它:

spring.devtools.restart.log-condition-evaluation-delta=false

排除不需要触发重启的资源

我们的应用中,某些资源的修改其实不需要重启服务,比如前端使用的静态资源文件,默认情况下,Spring Boot 在以下这些目录中的资源变更时,不会触发重启(但是会触发 live reload):

/META-INF/maven , /META-INF/resources , /resources , /static , /public , /templates

我们也可以手动指定这些路径:

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

如果你只是项额外增加路径而不覆盖 Spring Boot 提供的默认设置时,你可以设置这个属性:

spring.devtools.restart.additional-exclude = /custom-path/**

当你想设置的触发重启的文件不在 classpath 下的时候,你还可以使用以下设置作为触发应用重启的条件:

spring.devtools.restart.additional-paths

禁用自动重启

如果你不想使用 devtools 提供的自动重启功能,你也可以设置 spring.devtools.restart.enabled 属性来禁用它。

指定特殊文件触发重启

你可以通过设置 spring.devtools.restart.trigger-file 属性来指定触发重启的文件(常用于 IDE 持续的自动编译 class 导致应用一直重启)。

自定义重启使用的类加载器

在上面我们说过 devtools 将会使用两个类加载器用于重启应用,我们可以通过以下属性指定 classpath 下面的某个包使用哪个类加载器:

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

注:以上的属性需要添加到 classpath: META-INF/spring-devtools.properties 路径下。

LiveReload

devtools 包含了内置的服务器用于 live reload ,你可以通过属性 spring.devtools.livereload.enabled 来禁它。

全局设置

你可以在本地目录 ($HOME/.spring-boot-devtools.properties) 添加 devtools 的全局配置文件 (.spring-boot-devtools.properties )来设置 devtools。如:

windows

C:\Users\当前用户\.spring-boot-devtools.properties

结语

本篇文章介绍了 spring-boot-devtools,下一篇文章中,将会介绍远程应用的运行及更新。

其他

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容