IDEA新建springboot选择DevTools

  springboot-devtools模块能够实现热部署,添加类.添加方法,修改配置文件,修改页面等,都能实现热部署.

  原理就是重启项目,但比手动重启快多了,其深层原理是使用了两个ClassLoder,一个ClassLoader加载哪些不会改变的类(第三方jar包),另一个ClassLoader加载会更改的类.称之为restart ClassLoader,这样在有代码更改的时候,原来的restart Classloader被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间(5秒以内)

第一步:

引入插件:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> 不能被其它模块继承,如果多个子模块可以去掉 不必须
<scope>runtime</scope> 只在运行时起作用 打包时不打进去
</dependency>

本人试过,这个plugin可以不加

添加spring-boot-maven-plugin:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--fork : 如果没有该项配置,肯呢个devtools不会起作用,即应用不会restart 这个要手动加进去 -->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>

第二步:

启动项目即可:

1.devTools会坚挺classpath下的文件变动,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的.

2.devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现)这里注意不同的模板配置不一样.

如果使用idea,必须需要确保开启运行时编译才行

1,设置File ->Setting ->Compile: 勾选“Make project automatically”选项

使用快捷键ctrl+alt+shift+/,选择选项Registry,打开下面的界面 并找到图中红框的选项"compller.automake.allow.when.app.running"并勾选

 第三步:

重启idea

idea新建一个spring-boot工程,勾选DevTools即可,pom就会引入相应jar ,该jar默认是runtime 也就是只在运行时使用,打包时不打进去

devtools 原理说明

springboot包括一组额外的工具,可以使应用程序开发体验更加愉快,springboot-boot-devtools模块可以包含在任何项目中,它可以节省大量的时间.想要使用devtools支持,只需要将模块依赖关系添加到你的构建中:

Maven:

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

Gradle:

dependencies {
compile("org.springframework.boot:spring-boot-devtools")
}

运行打包的应用程序时,开发人员工具会自动禁用,如果你通过java-jar 或者其他特殊的类加载器进行启东时,都会被认为是"生产环境的应用"

将依赖标记为optional可选是一种最佳的做法,可以防止将devtools依赖传递到其他模块中,Gradle不支持开箱急用的optional依赖项,你可以参考propdeps-plugin.

属性默认设置

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

虽然缓存在生产中非常有益,但它在开发过程中可能会产生反效果,它会阻止你看到刚刚在应用程序中进行的更改。 因此,spring-boot-devtools 将默认禁用这些缓存选项。

缓存选项通常在application.properties 文件中配置。例如,Thymeleaf提供了spring.thymeleaf.cache属性。spring-boot-devtools 模块不需要手动设置这些属性,而是自动应用合理的开发时配置。

自动重启

spring-boot-devtools会在类路径上的文件发生更改时自动重启。 这在IDE中工作时可能是一个有用的功能,因为它为代码更改提供了非常快的反馈循环。 默认情况下会监视类路径上的所有变动,但请注意,某些资源(如静态资源和视图模板)不需要重启应用程序。

触发重启

当DevTools监视类路径资源时,触发重启的唯一方法是更新类路径。 导致类路径更新的方式取决于你正在使用的IDE。
在Eclipse中,保存修改的文件将导致类路径被更新并触发重启。 在IntelliJ IDEA中,构建项目( Build -> Make Project )将具有相同的效果。 重新启动和重新加载 Spring Boot提供的重新启动技术使用了两个类加载器。
不改变的类(例如,来自第三方jar的)被加载到 base 类加载器中。 你正在开发的类被加载到 restart 类加载器中。
当应用程序重启时, restart加载器将被丢弃,并创建一个新的类加载器。 这种方法意味着应用程序重启通常比“冷启动”快得多,因为 base 加载器已经已加载并且可用。

1. 排除资源

某些资源在更改时不一定需要触发重启。 例如,可以直接编辑Thymeleaf模板。 默认情况下,更改/META-INF/maven , /META-INF/resources , /resources , /static , /public或/templates中的资源不会触发重启,但会触发实时重新加载。 如果要自定义这些排除项,可以使用spring.devtools.restart.exclude属性。 例如,要仅排除/static和/public你将设置以下内容:

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

如果你想保留上面的默认(情况下的)值并添加其他的排除项,你可以使用

spring.devtools.restart.additional-exclude 属性。

2. 监控额外的路径

当你对不在类路径中的文件进行更改时,可能需要重启或重新加载应用程序。为此,请使用spring.devtools.restart.additional-paths 属性来配置监视其他路径的更改。你可以使用上述的 spring.devtools.restart.exclude 属性来控制附加路径下的更改是否会触发完全重启或只是实时重新加载 。

3. 禁用重启

如果不想使用重启功能,可以使用spring.devtools.restart.enabled属性来禁用它。 在大多数情况下,你可以在application.properties中设置此项(这仍将初始化重启类加载器,但不会监视文件更改)。

例如,如果你需要完全禁用重启支持,因为它不适用于特定库,则需要在调用SpringApplication.run(…)之前设置System属性。 例如:

public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}

4. 使用触发文件

如果你使用自动编译已更改文件的IDE,则可能希望仅在特定时间触发重启。 为此,你可以使用“触发文件”,这是一个特殊文件,当你要实际触发重启检查时,必须修改它。 更改文件只会触发检查,只有在Devtools检测到它必须执行某些操作时才会重启。 触发文件可以手动更新,也可以通过IDE插件更新。

要使用触发器文件,请使用spring.devtools.restart.trigger-file属性。

如果你希望将spring.devtools.restart.trigger-file设置为全局配置,可以参考下面第四小节。

5. 自定义重启类加载器

如上面重新启动和重新加载部分所述,重启功能是通过使用两个类加载器实现的。 对于大多数应用程序,此方法运行良好,但有时可能会导致类加载问题。

默认情况下,IDE中的任何打开的项目都会使用“restart”类加载器加载,任何常规.jar文件将使用“base”类加载器加载。 如果你在多模块项目上工作,但不是每个模块都导入到IDE中,则可能需要自定义配置。 为此,你可以创建一个META-INF/spring-devtools.properties文件。

spring-devtools.properties文件可以包含restart.exclude. 和restart.include. 前缀的属性。 include元素是应该被放入“restart”类加载器的项目, exclude元素是应该放入“base”类加载器的项目。 属性的值是应用于类路径下的正则表达式。

例如:

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

针对通用Mapper,可以做如下配置:

restart.include.mapper=/mapper-[\\w-\\.]+jar

所有属性的键值(名字,companycommonlibs 部分)必须是唯一的,只有 restart.exclude. 和 restart.include. 开头的属性有效。

所有类路径下面的 META-INF/spring-devtools.properties 配置文件都会生效,所以你可以把该配置打包到每个模块中。

注:新版本的Mapper(3.4.1+)会默认增加该配置。

6. 已知限制

重启功能对使用标准ObjectInputStream对象序列化的对象不是很好 。如果需要反序列化数据,可能需要使用Spring的ConfigurableObjectInputStream配合Thread.currentThread().getContextClassLoader() 使用。

不幸的是,一些第三方库都不考虑在使用上下文类加载器的情况下反序列化。 如果你发现这样的问题,你需要向原作者请求修复。

实时加载

spring-boot-devtools模块包含嵌入式LiveReload服务器,可以在资源更改时用于触发浏览器刷新。 LiveReload浏览器扩展程序支持Chrome,Firefox和Safari,你可以从livereload.com免费下载。

如果你不想在应用程序运行时启动LiveReload服务器,则可以将spring.devtools.livereload.enabled属性设置为false 。

同一时间只能运行一个LiveReload服务器。 开始应用程序之前,请确保没有其他LiveReload服务器正在运行。如果从IDE启动多个应用程序,则只有第一个应用程序将支持LiveReload。

全局设置

你可以通过向$HOME文件夹添加名为.spring-boot-devtools.properties的文件来配置全局devtools设置(请注意,文件名以“.”开头)。 添加到此文件的任何属性将适用于你的计算机上使用devtools的所有 Spring Boot应用程序。 例如,要配置重启始终使用触发器文件 ,你可以添加以下内容:

〜/ .spring-boot-devtools.properties
spring.devtools.reload.trigger-file=.reloadtrigger

springboot之DevTools热部署的简单原理解析的更多相关文章

  1. springboot 配置devtools热部署(不用重启服务可以刷新页面)

    一.加入devtools依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

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

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

  3. 玩转 Springboot 2 之热部署(DevTools)

    Devtools 介绍 SpringBoot 提供了热部署的功能,那啥是热部署累?SpringBoot官方是这样说的:只要类路径上的文件发生更改,就会自动重新启动应用程序.在IDE中工作时,这可能是一 ...

  4. SpringBoot项目构建、测试、热部署、配置原理、执行流程

    SpringBoot项目构建.测试.热部署.配置原理.执行流程 一.项目构建 二.测试和热部署 三.配置原理 四.执行流程

  5. SpringBoot魔法堂:应用热部署实践与原理浅析

    前言 后端开发的同学想必每天都在重复经历着修改代码.执行代码编译,等待--重启Tomcat服务,等待--最后测试发现还是有bug,然后上述流程再来一遍(我听不见)

  6. Java服务器热部署的实现原理

    转自:http://blog.csdn.net/chenjie19891104/article/details/42807959 在web应用开发或者游戏服务器开发的过程中,我们时时刻刻都在使用热部署 ...

  7. SpringBoot项目设置热部署

    记录一个SpringBoot 设置热部署(修改项目之后,项目自动重启)实例 POM.XML 文件 <!-- 配置springBoot项目的热部署启动 --> <dependency& ...

  8. SpringBoot入门教程(十二)DevTools热部署

    devtools模块,是为开发者服务的一个模块.主要的功能就是代码修改后一般在5秒之内就会自动重新加载至服务器,相当于restart成功.与JRebel不同的是,JRebel是一款商业插件,devto ...

  9. 在SpringBoot中使用热部署(DevTools)

    一.简介 有时候我们开发完SpringBoot项目后,启动运行.但是经常发现代码需要反复修改,然后修改部分内容后需要再启动....这样太费时了,热部署就是用来解决这一问题.让你修改完代码后,能自动执行 ...

随机推荐

  1. 【操作系统之七】Linux常用命令之tail

    一.概念linux tail命令用途是按照要求将指定的文件的最后部分输出到标准设备,一般是终端,就是把某个档案文件的最后几行显示到终端上,如果该档案有更新,tail会自动刷新,确保你看到最新的档案内容 ...

  2. 第十七节:.Net Core中新增HttpClientFactory的前世今生

    一. 背景 1.前世 提到HttpClient,在传统的.Net版本中简直臭名昭著,因为我们安装官方用法 using(var httpClient = new HttpClient()),当然可以Di ...

  3. Linux中常用命令pipe

    大多数linux命令处理数据后都会输出到标准输出,但是如果数据要经过系列列的步骤处理后,才是需要的数据个数,这种需求就需要管道来帮助完成. 管道命令使用"|"作为界定符,将界定符前 ...

  4. C#调用 kernel32.dll

    调用方法: private string mFileName; //INI文件名 public OneGanttINI(string pFileName) { this.mFileName = App ...

  5. 示例:在Nuget发布自己的包的步骤

    原文:示例:在Nuget发布自己的包的步骤 一.目的:很多时候都在用第三方的Nuget包,现成的轮子可以减少很多工作量,同时我们也可以造轮子供自己和其他人使用,本示例主要演示如何发布dll到Nuget ...

  6. C#:Json字符串、JsonArray字符串处理

    今天在做Asp网站开发的时候接受到了一种下面这种样子的字符串: "[ { "mid": "123456", "nid": &quo ...

  7. 【WPF】1、 基本控件的简介

    WPF一直都是断断续续的使用.偶尔用到一下.但是每次间隔比较长,需要重新学习,就写了这篇日志.以后有问题,看这个就可以了解各大概,然后针对细节再另外想办法. 微软的东西真心好,如果什么都不懂,可以直接 ...

  8. Mysql中的排序查询

    进阶3:排序查询 语法: select 查询列表 from 表 [where 筛选条件]order by 排序列表 [asc 升序 | desc降序] 例子 查询员工信息,要求工资从高到低 SELEC ...

  9. java。JDK的API,版本1.6.0中文版下载

    转载自https://blog.csdn.net/xiao9469/article/details/87783561 链接: https://pan.baidu.com/s/1YqrbTD_msTmn ...

  10. 简要介绍Linux网络服务的种类

    如果有人问你Linux最强大的功能是什么,你大概会回答“是网络功能”.Lmux操作系统的优势之一就是网络功能了,这包含比较稳定的系统资源分配,以及较为安全的网络防护能力,所以许多人都喜欢用它来进行网络 ...