Spring Boot使用Maven工具自动重启SpringBoot项目 | 热部署
Posted 猫巳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot使用Maven工具自动重启SpringBoot项目 | 热部署相关的知识,希望对你有一定的参考价值。
文章目录
本页将介绍Spring Boot
使用maven
的开发工具自动重启的情况。
当我们的应用程序使用spring boot
开发者工具时,只要在开发模式下修改类路径中的文件,它就会自动重启服务器并刷新浏览器页面。
我们使用spring boot
maven
命令mvn spring-boot:run
运行我们的分解形式的项目。
Spring boot
开发工具是spring-boot-devtools
,需要在maven
或gradle
中配置。
开发者工具用于快速开发。
当我们在IDE
中使用分解形式的项目时,在修改了任何文件后,我们需要测试我们的应用程序。
为了节省开发时间,有许多插件,如JRebel
,可以使用类加载器重新加载文件的变化。
Spring boot
也提供了一个工具来帮助开发者快速开发,这就是spring-boot-devtools
。
在这里,我们将了解开发者工具的一个功能,即在类路径中的任何文件发生变化时,自动重启服务器以及在浏览器上刷新页面。
为了获得页面刷新,我们需要在浏览器中安装LiveReload
。
开发者工具提供了许多属性,这些属性将被配置在应用程序的属性文件中以控制自动重启。
现在我们将提供一个例子,一步一步地使用开发者工具进行自动重启。
使用的软件
- Java 8
- Maven 3.3.9
- Spring Boot 1.4.3.RELEASE
- Eclipse Mars
配置开发者工具
Spring
提供了spring-boot-devtools
的开发者工具。
这些工具在应用开发模式中很有帮助。
开发者工具的一个特点是自动重启服务器。要使用maven配置开发者工具,我们需要添加spring-boot-devtools
的依赖关系,如下所示。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
如果我们使用Gradle
,我们将添加spring-boot-devtools
的依赖项,如下所示。
compile("org.springframework.boot:spring-boot-devtools")
在使用开发者工具时,我们应该知道以下几点。
1. 当我们创建一个JAR
或WAR
作为完全打包的应用程序并运行它时,开发人员工具就会自动被禁用。
2. 当我们使用java -jar
或特殊类加载器运行应用程序时,它被认为是一个“生产项目(production application
)”,开发工具将被自动禁用。
3. 最佳做法是设置为<optional>true</optional>
,这样可以避免开发人员工具在其他模块上传递应用。Gradle
目前不支持此功能。
4. 我们还可以在maven
和gradle
中使用excludeDevtools
,以确保开发人员工具JAR
永远不会包含在生产构建中。
5. 配置开发人员工具后,使用restartclassloader
启动分解形式的项目,并通过springboot
使用base
类加载器启动完全打包的应用程序。
在浏览器中安装LiveReload
在spring MVC
项目中,有一个网络服务器和浏览器的参与。
在开发模式下,每当我们改变任何文件时,通常需要重新启动服务器并刷新浏览器以获得更新的数据。
Spring boot
开发工具已经将这两项任务自动化。
为了自动刷新浏览器,我们需要安装LiveReload
。
在我们的例子中,我使用的是Firefox
。
我需要在我的Firefox
中安装LiveReload
。
按照下面的步骤,准备好LiveReload
。
1. 进入LiveReload
扩展链接并安装它。
2. 要使用LiveReload
,我们需要运行LiveReload
服务器。对于我们来说,spring boot
开发工具将启动一个LiveReload
服务器。
3. LiveReload
可以被启用和禁用。要使用LiveReload
刷新页面,必须启用它。
4. 在我的例子中,我在Firefox
中使用LiveReload
。要启用它,首先进入Firefox
的自定义视图,从那里将LiveReload
添加到工具栏。现在,右击LiveReload
图标并启用它。在启用它之前,确保maven
的 mvn spring-boot:run
命令正在运行,这将启动tomcat
和LiveReload
服务器。
自动重启
Spring boot
的开发者工具有一个功能,每当类路径上的文件被修改,就会自动重启服务器并刷新浏览器页面。
一旦我们在maven
或gradle
中配置了开发者工具,那么在eclipse
中修改文件后,当我们保存时,自动重启功能就会启动。
所有在类路径中的文件都不需要服务器重启。
很多文件只需要在浏览器上刷新页面就可以完成任何修改。
当我们对java
文件进行任何修改并保存时,服务器重启和浏览器刷新都需要。
有些文件不需要服务器重启,只需要在浏览器上刷新页面,例如静态页面、Thymeleaf
模板、html
页面等。
对于类路径上同样需要在浏览器上安装LiveReload
的以下路径,Spring boot
开发工具默认只在浏览器上执行页面刷新。
这些目录模式如下。
/META-INF/maven
/META-INF/resources
/resources
/static
/public
/templates
现在我们将用Spring MVC
和Thymeleaf
创建一个示例应用程序。这里我们还将创建一些不在类路径中的文件。找到项目结构。
位于类路径中的文件如下所示。
1. Java
文件:在浏览器上自动重启服务器和刷新页面
src\\main\\java\\com\\concretepage\\Application.java
src\\main\\java\\com\\concretepage\\controller\\HelloController.java
2. 资源文件:默认情况下,仅在浏览器上自动刷新页面
src\\main\\resources\\static\\index.html
src\\main\\resources\\templates\\hello.html
src\\main\\resources\\application.properties
我们还创建了一些不在类路径中的文件。
files\\apptrigger.txt
files\\txt\\txtfile.txt
现在找到我们的maven配置文件。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.concretepage</groupId>
<artifactId>spring-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<description>Spring Boot Automatic Restart</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
测试自动重启的步骤。
1. 使用链接下载我的演示项目源代码并将其导入eclipse
。
2. 使用命令提示符进入项目的根目录,运行命令mvn clean eclipse:eclipse
并刷新eclipse
中的项目文件夹。这将创建一个类路径文件。
3. 现在运行命令mvn spring-boot:run
,这将启动一个Tomcat
服务器。或者在IDE
中进入主类。右键单击并Run As
-> Java Application
4. 现在进入浏览器,访问 http://localhost:8080/
或http://localhost:8080/hello
。
5. 点击浏览器工具栏菜单上的LiveReload
图标,启用自动刷新页面。
6. 现在改变java
文件中的一些内容并保存。我们将观察到,服务器将重新启动,浏览器上的页面将刷新。
7. 现在改变HTML
文件中的内容。我们将观察到,只有浏览器上的页面会刷新,而服务器不会重新启动。
自定义监听路径
到目前为止,我们已经了解到SpringBoot
开发者工具只监听位于类路径下的文件,以便自动重新启动。
现在我们将包括那些不在类路径中的文件。
在我们的项目中,我们在包含以下文件的类路径之外创建了一个名为files
的目录。
files\\apptrigger.txt
files\\txt\\txtfile.txt
尽管文件目录不在类路径中,但它仍然可以利用自动重启的优势。
为了实现它,SpringBoot
提供了需要在应用程序属性文件中配置的属性,如下所示。
application.properties
spring.devtools.restart.additional-paths = files
这里的文件是我在项目的根目录下创建的目录。
配置完属性后,我们需要重新运行命令mvn spring-boot:run
,现在通过改变文件apptrigger.txt
或txtfile.txt
中的内容来测试自动重启,并保存它,我们将观察到服务器将重启,页面将在浏览器上刷新。
使用触发器文件
Spring boot
提供了一个配置触发器文件的属性,以实现如果触发器文件被修改时,开发工具才会开始监听文件变化。
在使用IDE
的开发模式中,我们经常改变文件并保存它。
为了避免不必要的自动重启,我们可以使用一个触发器文件。
每当我们修改触发器文件时,只有当开发工具监听到文件的任何变化,如果文件有任何变化,自动重启就会启动。
触发器文件可以手动修改,也可以使用IDE
插件。为了配置触发文件,spring boot
提供了spring.devtools.restart.trigger-file
属性,可以按以下方式配置。
application.properties
spring.devtools.restart.additional-paths = files
spring.devtools.restart.trigger-file = apptrigger.txt
在上述配置中,apptrigger.txt
是我们的触发器文件,它位于files/apptrigger.txt
路径上。找到下面的步骤来测试触发器文件。
1. 首先重新运行命令mvn spring-boot:run
2. 现在修改任何文件,假设我正在修改任何java
文件,例如HelloController.java
,然后修改触发器文件,即apptrigger.txt
。我们将观察到,自动重启将被启动。
3. 我们需要明白,如果我们只修改apptrigger.txt
,那么就不会有自动重启。这是因为当我们修改触发器文件apptrigger.txt
时,开发工具会开始观察文件的任何变化,由于我们没有修改其他文件,所以自动重启不会发生。
剔除资源
对于位于类路径下的文件,spring boot
开发工具会关注完全自动重启,但文件夹结构为/META-INF/maven
、/META-INF/resources
、/resources
、/static
、/public
或/templates
的模板和静态文件,默认只获得页面刷新。
我们可以打破模板和静态文件的默认设置,实现完全自动重启。为了实现这一点,我们需要配置spring.devtools.restart.exclude
属性,如下所示。
application.properties
spring.devtools.restart.exclude = static/**
让我们了解现在将发生什么。
1. 首先重新运行命令mvn spring-boot:run
2. 现在,如果我们修改文件templates\\hello.html
,开发工具将自动重新启动服务器,并刷新页面。
3. 如果我们修改文件static\\index.html
,开发工具将只刷新页面。
4. 如果我们想把更多的文件夹排除在完全自动重启之外,我们可以配置逗号分隔,如下所示。
spring.devtools.restart.exclude=static/**,templates/**
禁用重新启动
如果我们想从开发工具中禁用自动重启功能,我们可以通过两种方式配置spring.devtools.restart.enabled
属性来实现。
1. 使用应用程序属性文件
application.properties
spring.devtools.restart.enabled = false
在这种情况下,开发人员工具将初始化重启类加载器,但不会监视文件更改。
2. 在调用 SpringApplication.run() 之前使用系统属性,如下所示。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(Application.class, args);
}
}
在这种情况下,开发工具不会初始化重启类加载器,也不会监听文件变化。因此,自动重启被完全禁用。
自动重新启动中常用的属性
这里我们列出了用于自动重启的有用的开发工具属性。这些属性是在application.properties
文件中配置的。
spring.devtools.restart.additional-paths: 添加不在类路径中的自动重启路径。
spring.devtools.restart.trigger-file: 指定一个触发器文件名,现在开发人员工具仅在修改触发器文件时才监听重新启动检查。
spring.devtools.restart.exclude: 指定路径,将文件排除在完全自动重启之外。
spring.devtools.restart.additional-exclude: 指定将被排除在完全自动重启之外的其他路径,保持默认设置。
spring.devtools.restart.enabled: 如果值为false
,那么开发者工具将停止监听自动重启的文件。
现在我们将提供用于定制重启加载器的属性,这些属性将被配置在META-INF/spring-devtools.properties
文件中。
restart.include. : 它是一个前缀,我们使用它来声明一个属性,并通过正则表达式模式来指定JAR
的名称,以便将一个JAR
从基础类加载器包含到重启类加载器。
restart.exclude. : 它是一个前缀,我们使用它声明一个属性,并使用正则表达式模式分配JAR
名称,以将JAR
从重新启动类加载器排除到基本类加载器。
参考文献
【1】Using Spring Boot: Developer tools
【2】Spring Boot Automatic Restart using Developer Tools with Maven
下载源码
spring-boot-automatic-restart-using-developer-tools-with-maven.zip
以上是关于Spring Boot使用Maven工具自动重启SpringBoot项目 | 热部署的主要内容,如果未能解决你的问题,请参考以下文章
使用Spring Boot开发者工具进行自动重启和页面自动刷新
使用Spring Boot开发者工具进行自动重启和页面自动刷新
maven工程使用spring-boot-devtools进行热部署,更改代码避免重启web容器