在Idea中开发Spring Boot项目,每当修改内容之后,都需要点一下重启来进行重新发布,比较繁琐。针对这个问题Spring Boot中提供了一个devtools的工具项目,可以帮助我们完成自动刷新,热部署的功能。

本文给大家提供两种形式的热部署操作,下面看具体的操作。

引入依赖

在项目中引入devtools的pom依赖:

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

需要注意的是optional要设置为true。

为了测试页面,效果,我们同时引入了web和Thymeleaf相关的依赖:

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

Build中配置

在原来默认的Build插件中添加configration配置,用于让devtools生效。

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--使得devtools生效--> <fork>true</fork> </configuration> </plugin> </plugins> </build>

Idea配置

在Idea配置中找到Complier选择,勾选其中的“Build Project automatically”。

idea怎么跑别人的springboot项目(SpringBootIdea中热部署)(1)

配置该项的主要作用就是让Idea可以自动Build项目。

但Idea自动Build项目还是有条件的,也就是说此处配置自动构建并不代表可以在任何情况下都可以自动构建。

当Idea检测到应用程序正在执行(running)的时候,是不会进行构建的。

所以还需要后续的操作进行热部署。

手动热部署

经过以上步骤之后,如果你习惯使用快捷键,而想达到改好一批代码之后,自主控制热部署,那可以使用快捷键或点击“Build”中的“Build Project”就行构建项目,实现热部署。

就像上面说的,虽然设置了自动构建,但是当项目运行时并不会自动构建,那就需要我们手动去构建。

idea怎么跑别人的springboot项目(SpringBootIdea中热部署)(2)

当点击完成之后,日志中就会打印热部署相关的信息。

此种方式适合,批量的,完成一整块功能之后,进行热部署。

自动热部署

那么如何实现改一行代码就进行一次热部署呢?这还需要再次修改Idea。就像上面说的,把Idea改成即使项目正在运行(running)也运行进行构建。

具体配置就在打开Registry,勾选“Compiler autoMake allow when app running”选项,然后最后重启一下Idea。自动热部署便生效了。修改完代码,每隔几秒钟,便会重新部署一下。

那么,如何打开Registry呢?在Windows操作系统下快捷键为“ctrl shift alt /”。

idea怎么跑别人的springboot项目(SpringBootIdea中热部署)(3)

Mac操作系统下,默认好像没有。不过如果你不知道快捷键是什么也没关系。直接在Idea配置中找到对应的配置项,设置一个快捷键即可。

idea怎么跑别人的springboot项目(SpringBootIdea中热部署)(4)

在KeyMap中搜索“Registry”,找到对应的选项,然后查看或配置对应的快捷键即可。

这里我们顾名思义“Compiler autoMake allow when app running”,就是当app在运行时也运行自动编译构建。

两种方案对比

上面已经提到第一种方案可以自主控制,而第二种方案呢由Idea自动进行编译处理。

个人推荐第一种方案,比例不停的重启,不停的部署。

Devtools的基本原理

深层原理是使用了两个ClassLoader。一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader。

当代码有改动时,旧的restart ClassLoader被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,相对于完全重启就节省了时间。

其他

另外需要注意,如果你使用了像Freemarker或Thymeleaf这样的模板引擎,还需要在application.properties中配置类似如下禁止缓存的配置:

spring.thymeleaf.cache=false

上面以thymeleaf的配置为例,其他配置雷同。生产发布时,再将其去掉。

,