默认情况下, 我们修改 class 或者 修改模板文件(templates目录 下面的文件) 等动态资源, 都不会立即自动生效。 在IDEA中, 我通过Ctrl + F9 , 仍然是无效。 当然, 静态资源的修改是可以立即更新的, 但是也是需要Ctrl + F9 编译一次, 另外前端浏览器需要F5刷新一遍。

有没有好的办法呢? 有!其实 boot 已经 提供了 devtools 这么一个工具。 在 pom.xml 的dependencies标签配置下面的内容后, 就可以了!

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

对于 devtools , 我们还可以给设置optional 参数, 据说是可以提供编译速度:
        <optional>true</optional>

有人说,还需要配置一个 fork:

  1. <plugins>
  2. <plugin>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-maven-plugin</artifactId>
  5. <configuration>
  6. <!--fork :  如果没有该项配置,肯呢个devtools不会起作用,即应用不会restart -->
  7. <fork>true</fork>
  8. </configuration>
  9. </plugin>
  10. </plugins>

我测试不是这样的, fork 是 true false 都不要紧。 fork的作用好像不是这个。 我看了官方文档是:

Flagging the dependency as optional is a best practice that prevents devtools from being transitively applied to other modules using your project

也就是说 避免 devtools 传递性的被应用到项目中其他的 module, 好像也不要紧,它仅仅是要给最佳实践。

devtools 还有一个作用是把 spring.thymeleaf.cache 之类的缓存功能给关闭了。

这样, 我们就可以随意修改java 源码和 动态资源文件了, 我测试过,新增删除java方法或者java 文件,或者 动态资源文件, 都是可以生效的。 

但是, 在IDEA中, 我们需要 按Ctrl + F9 , 有没有办法自动编译呢? IDEA 默认不就是自动编译的吗? 为什么需要 Ctrl + F9? 有没有办法可以不 按Ctrl + F9呢, 当然也是可以的

IDEA 配置

  • CTRL + SHIFT + A 查找 勾选 make project automatically 选项
  • ctrl+shift+alt+/ 查找Registry 勾选 compiler.automake.allow.when.app.running 选项

另外我观察到, 修改java 文件, 按Ctrl + F9 就相当于重启了一遍(观察控制台日志可知)。而模板文件不是这样的,它没有什么日志打印出来, 貌似是仅仅替换了那个文件。

而boot 为DevTools 也是提供了一些配置的。 这些配置可以控制 哪些修改 是否导致restart :

# DEVTOOLS (DevToolsProperties)
spring.devtools.livereload.enabled=true # Enable a livereload.com compatible server.
spring.devtools.livereload.port=35729 # Server port.
spring.devtools.restart.additional-exclude= # Additional patterns that should be excluded from triggering a full restart.
spring.devtools.restart.additional-paths= # Additional paths to watch for changes.
spring.devtools.restart.enabled=true # Enable automatic restart.
spring.devtools.restart.exclude=META-INF/maven/**,META-INF/resources/**,resources/**,static/**,public/**,templates/**,**/*Test.class,**/*Tests.class,git.properties # Patterns that should be excluded from triggering a full restart.
spring.devtools.restart.poll-interval=1000 # Amount of time (in milliseconds) to wait between polling for classpath changes.
spring.devtools.restart.quiet-period=400 # Amount of quiet time (in milliseconds) required without any classpath changes before a restart is triggered.
spring.devtools.restart.trigger-file= # Name of a specific file that when changed will trigger the restart check. If not specified any classpath file change will trigger the restart. # REMOTE DEVTOOLS (RemoteDevToolsProperties)
spring.devtools.remote.context-path=/.~~spring-boot!~ # Context path used to handle the remote connection.
spring.devtools.remote.debug.enabled=true # Enable remote debug support.
spring.devtools.remote.debug.local-port=8000 # Local remote debug server port.
spring.devtools.remote.proxy.host= # The host of the proxy to use to connect to the remote application.
spring.devtools.remote.proxy.port= # The port of the proxy to use to connect to the remote application.
spring.devtools.remote.restart.enabled=true # Enable remote restart.
spring.devtools.remote.secret= # A shared secret required to establish a connection (required to enable remote support).
spring.devtools.remote.secret-header-name=X-AUTH-TOKEN # HTTP header used to transfer the shared secret.

默认改变 /META-INF/maven, /META-INF/resources, /resources, /static, /public or /templates 等目录文件,会重新重启项目?? ,当然我们编辑静态文件不想重启项目可以配置

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

我们可以通过:

spring.devtools.restart.enabled=false

禁止devtools 进行重启,但是,这样之后, 我们对java 文件的修改就不会生效,这时 Ctrl + F9 也没用, 因为class 文件不会替换。 所以,看来重启还是不可避免的。—— 不知道为什么devtools没有提供类似 jrebel 的class热加载的功能,通过重启来实现热加载实在是感觉有些low。

另外,我们可以设置 spring.devtools.restart.trigger-file= 属性。 它可以减少我们的重启次数(过多的重启也确实很烦哦),但是,这样之后,我们得记住那个特定的文件,当我们需要重启的时候,我们得手动修改它,或者插件修改。 手动修改的话,我试过,感觉还不如不用devtools 得了, 每次我想重启直接点击重启按钮不是一样的操作吗?(当然,devtools 多了个reload的功能) , 使用插件的话, 没找到什么好的插件。应该就是指 livereload ,jrebel之类的了吧。也感觉用起来不流畅。

总之,devtools 还是挺强大的,它提供了很多的配置。但仍有不足,期待能够集成jrebel变得更好。

参考:

https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/htmlsingle/#using-boot-devtools-restart

http://blog.csdn.net/isea533/article/details/70495714  这个完全就是上面官方文档的翻译。

http://www.logicbig.com/tutorials/spring-framework/spring-boot/trigger-file/

SpringBoot 之热部署的更多相关文章

  1. Springboot静态文件不更新的解决办法,以及Springboot实现热部署

    Springboot静态文件不更新的解决办法,以及Springboot实现热部署 原文链接:https://www.cnblogs.com/blog5277/p/9271882.html 原文作者:博 ...

  2. idea+spring-boot+devtools热部署

    idea+spring-boot+devtools热部署 标签: spring-boot 2017-03-20 14:45 2635人阅读 评论(1) 收藏 举报  分类: spring-boot m ...

  3. SpringBoot工程+热部署进行远程调试

    本文转载自:https://blog.csdn.net/qq_31868349/article/details/78553901 SpringBoot工程+热部署进行远程调试 本地端添加配置 在pom ...

  4. springBoot开启热部署

    springBoot开启热部署 这里使用devtools工具开启热部署 〇.搭建springbboot基础环境 一.添加依赖 <dependency> <groupId>org ...

  5. spring-boot项目热部署以及spring-devtools导致同类不能转换

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

  6. SpringBoot工程热部署

    SpringBoot工程热部署 1.在pom文件中添加热部署依赖 <!-- 热部署配置 --> <dependency> <groupId>org.springfr ...

  7. 从零开始学习springboot之热部署的配置

    各位看官大家好,博主之前因为毕业设计以及毕业旅游耽搁了好长一段时间没有更新博客了,从今天起又会慢慢开始学习啦. 今天主要是来学习springboot热部署的配置. 一. 热部署 我们通常在修改某些文件 ...

  8. SpringBoot SpringCloud 热部署 热加载 热调试

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] Crazy-Sp ...

  9. springboot 配置热部署 及 热部署后依旧是404的坑

    springboot配置热部署的教程网上一大堆: 个人喜欢这种方式: https://www.cnblogs.com/winner-0715/p/6666579.html 本文主要强调的是,大家如果配 ...

  10. springboot的热部署

    SpringBoot 4.SpringBoot 整合 devtools 实现热部署   一.添加 devtools 依赖 <!-- Spring boot 热部署 : 此热部署会遇到 java. ...

随机推荐

  1. 黄金点游戏 结队i项目

    结对编程——黄金点游戏   本次的结对编程的项目是黄金点游戏,我的结对对象是冯雨倩,我们的编程能力都不太好,而且都对C语言更熟悉些,因此我们决定用C语言来实现. (1)分工:角色分配:冯雨倩是领航员, ...

  2. dyne*cm and N*m

  3. GitHub入门与实践 读书笔记二:Git的导入

    1.诞生背景 Linux的创始人Linus Torvalds 在2005年开发了Git的原型程序,后随着众多开发者的共同努力,现在他已经被大量的程序员采用. 2.什么是版本管理 版本管理:管理软件在开 ...

  4. FCC JS基础算法题(4):Title Case a Sentence(句中单词首字母大写)

    题目描述: 确保字符串的每个单词首字母都大写,其余部分小写.像'the'和'of'这样的连接符同理. 算法: function titleCase(str) { // 转小写及分割成数组 var st ...

  5. CMD命令,动态执行存储或DML命令

    --exec master..xp_cmdshell CMD命令 --EXECUTE sys.sp_sqlexec 执行存储 --EXEC sp_executesql 执行DML语句

  6. laravel 创建自动化生成数据库

    1.   生成 迁移脚本 php artisan make:migration create_users_table --create=users(表名) 当你⽣成⼀个模型时想要顺便⽣成⼀个 数据库迁 ...

  7. Oracle之 dmp导入/导出、数据库操作等过程中的字符集问题

    影响Oracle数据库字符集最重要的参数是NLS_LANG参数. 它的格式如下: NLS_LANG = language_territory.charset 它有三个组成部分(语言.地域和字符集),每 ...

  8. swap 用指针交换两个整型数值

  9. 在IDEA中实战Git-branch

    工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ...

  10. 我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 HtmlCore

    大家好 , 我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 , 名字叫 HtmlCore  . 项目的一个主要目标是可以用 .Net 在 移动设备 上 开发 GUI 程序 (界面程 ...