默认情况下, 我们修改 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. python脚本 FTP上传学习

    学习了这个博文http://www.cnblogs.com/cacique/archive/2012/08/24/2653686.html,楼主这个文章很适合初学者,所以根据楼主的内容推演了下上传文件 ...

  2. Linux性能监控分析命令(一)—vmstat命令详解

    一.vmstat介绍 语法格式: vmstat [-V] [-n] [-S unit] [delay [count]] -V prints version. -n causes the headers ...

  3. iOS 添加第三方字体

    有时候根据UI的设计,我们需要添加第三方字体到工程中,实现特殊的效果. 一,把第三方字体包导入工程 二,在info.plist文件中添加Fonts provided by application 类型 ...

  4. Windows文件夹、文件源代码对比工具--WinMerge

    /********************************************************************** * Windows文件夹.文件源代码对比工具--WinM ...

  5. 初识mysql数据库

    mysqld install :找到你的库 net start mysql ;启动mysql的服务端(server) mysql -uroot -p :启动mysql的客户端(Client) exit ...

  6. Linux 文件类型笔记

    在UNIX中一切都是文件https://ph7spot.com/musings/in-unix-everything-is-a-file在UNIX中,一切都是字节流 ==== linux系统的文件类型 ...

  7. oracle database 11g 如何正确卸载

    如在使用过程中,遇到oracle database 的疑难问题,需要重装的时候,就需要我们先将老的oracle 做完全的卸载删除,这样才能安装新的oracle database. 下面看一下具体的卸载 ...

  8. 数组中只出现一次的数字(java实现)

    问题描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. 解题思路 如果数组中只有一个数字出现奇数次,则将数组中所有的数字做异或可得该数字. 数组中有两 ...

  9. 如何在Windows命令行(DOS界面)中调用 编译器 来编译C/C++源程序

    首先说明一下背景: 为什么要在DOS界面编译C/C++源程序?有很多现成的开发环境(IDE)如:vs, vc++等,这些开发环境集成了编译,调试,使用起来很方便,而且图形化操作界面,简洁明了.但是在开 ...

  10. VUE 进行微信支付,解决 微信支付URL未注册

    使用history方式 比较坑吧就不吐槽了,说下实现方式 需要解决问题: 1.因为我的微信支付授权路由是:m.xxxx.com,this.$router.push('xxx')之后经常出现 [微信支付 ...