Spring Boot整合Devtools热部署

一、Devtools简介

DevTools通过提供自动重启和LiveReload功能,使您更快、更轻松地开发Spring Boot应用程序。除此之外,它还将各种属性设置为更适合本地开发的值。此外,它允许您远程连接到您的应用程序,并仍然使用其大部分功能。在生产中运行时,不要使用DevTools。

 

二、集成Devtools

搭建一个简单的Spring Boot项目,然后引入Spring-Boot-devtools:

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

devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),因为其采用的虚拟机机制,该项重启是很快的。

<build>
	<finalName>my_project</finalName>
	<plugins>
	  <plugin>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-maven-plugin</artifactId>
		<configuration>
		  <!--fork 如果没有改配置devtools不会起作用,即应用不会restart-->
		  <fork>true</fork>
		</configuration>
	  </plugin>
	</plugins>
</build>

 

如果使用的是Intellij IEDA开发工具,还需要到设置里将project automatically勾选上;File->Setting->Build,…->Compiler  将右侧project automatically勾上

 

Intellij IEDA 使用ctrl+shift+a 快捷键搜索Registry,选择搜索出来的第一个

 

找到compiler.automake.allow.when.app.running,勾上开启此功能即可

 

此时重新启动项目即可实现热部署,改动任意代码会立即生效,不用再每次重新启动项目

 

三、Devtools其它介绍

1)仅限开发

Spring Boot DevTools的用法仅用于开发,而不用于生产。如果您的应用程序检测到您正在生产中运行,则会自动禁用DevTools。

部署时有两种模式:fully packaged artifact完全打包和exploded artifact ;采取前者打包方式Spring会认为是生产应用;后者认为是开发模式,在Idea等IDE中采取的是后者。

 

2)属性覆盖

在本地开发应用程序时,与在生产环境相比通常需要不同的配置。自己管理多组配置是不必要的复杂。好消息是Spring Boot DevTools为您的本地开发配置了许多开箱即用的属性。

spring.thymeleaf.cache=false
spring.freemarker.cache=false
spring.groovy.template.cache=false
spring.mustache.cache=false
server.servlet.session.persistent=true
spring.h2.console.enabled=true
spring.resources.cache.period=0
spring.resources.chain.cache=false
spring.template.provider.cache=false
spring.mvc.log-resolved-exception=true
server.servlet.jsp.init-parameters.development=true
spring.reactor.stacktrace-mode.enabled=true

可以检查DevToolsPropertyDefaultsPostProcessor中所有属性的列表。

 

3)远程连接

除本地开发外,您还可以连接到运行DevTools的远程应用程序。这不适用于生产环境,因为它可能是一个严重的安全风险。但是,它在预生产环境中非常有用。

默认情况下不启用远程连接。您需要通过修改pom文件显式启用它:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludeDevtools>false</excludeDevtools>
            </configuration>
        </plugin>
    </plugins>
</build>

然后,您需要设置一个密码,以便在连接到远程应用程序时用于身份验证:

spring.devtools.remote.secret=somesecret

远程应用程序运行后,您可以启动远程连接会话,现在,您需要启动org.springframework.boot.devtools.RemoteSpringApplication,使用远程应用程序的URL作为参数启动。请注意,https如果可能,请使用https。

在IDE中轻松运行远程连接。在IDEA中,您只需创建一个新的运行配置。转到Run → Edit Configurations...并创建一个+左上角带有图标的新配置。选择Application类型。

从DevTools模块中选择RemoteSpringApplication作为Main类,并设置远程参数远程应用程序的URL。

运行此配置后,如果与远程应用程序的连接成功,您应该会看到相应的输出。

连接到远程应用程序后,DevTools监视类路径更改,与本地开发相同。但是,它不是本地重新启动,而是将更改推送到远程服务器并在那里触发重新启动。这比构建应用程序和部署到远程计算机要快得多。

 

4)Live Reload

LiveReload是一个有用的工具,它允许您在文件中进行更改时立即在浏览器中更新页面,如HTML,CSS,图像等。它甚至可以根据需要预处理文件 - 这意味着自动编译SASS或LESS文件。

Spring DevTools自动启动LiveReload服务器的本地实例,该服务器监视您的文件。您需要做的就是安装一个浏览器扩展,然后你就可以了。它不仅可用于开发应用程序的前端(如果将其作为Spring应用程序工件的一部分进行分发),还可用于监视和重新加载REST API的输出。

 

5)限制

使用DevTools的Spring应用程序会自动启动LiveReload服务器。不幸的是,此服务器中只有一个实例可以同时运行。更确切地说,只有第一个可行。这不仅适用于使用DevTools的Spring应用程序的多个实例,也适用于任何其他应用程序,这些应用程序也在后台使用LiverReload,例如Gatsby在开发模式下。

如果要将Spring应用程序配置为不启动LiveReload服务器,可以在application.properties加入:

spring.devtools.livereload.enabled=false

 

6)全局配置

可以像使用任何其他Spring应用程序一样使用配置属性配置DevTools。这通常意味着编辑application.properties您的项目。此配置对于每个应用程序是独立的。

但是,在某些情况下,为同一台计算机上运行的所有应用程序进行全局配置可能很方便。您可以创建一个名为.spring-boot-devtools.properties位于$HOME目录中的属性文件。此文件中声明的配置将应用于运行DevTools的所有应用程序。

 

7)与第三方库的冲突

DevTools通常应该正常运行,但它可能与第三方库有冲突。特别是,已知问题是使用标准ObjectInputStream进行反序列化存在存在冲突。如果发生此类冲突,您可以通过设置禁用自动重启:

spring.devtools.restart.enabled=false

将不再触发重启。但是,仍将使用重新启动类加载器。如果您需要完全禁用类加载器,则需要在启动应用程序之前执行此操作:

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

即使您不使用自动重启,您仍然可以从DevTools提供的其他功能中受益。

 

8)关机钩ShutdownHook

DevTools依赖于关机挂钩的SpringApplication。如果您使用以下方法手动禁用挂钩,它将无法正常工作:

springApplication.setRegisterShutdownHook(false);

认情况下,挂钩已启用,因此除非您明确禁用它,否则无需担心它。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值