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,需要在mavengradle中配置。

开发者工具用于快速开发。

当我们在IDE中使用分解形式的项目时,在修改了任何文件后,我们需要测试我们的应用程序。

为了节省开发时间,有许多插件,如JRebel,可以使用类加载器重新加载文件的变化。

Spring boot也提供了一个工具来帮助开发者快速开发,这就是spring-boot-devtools

在这里,我们将了解开发者工具的一个功能,即在类路径中的任何文件发生变化时,自动重启服务器以及在浏览器上刷新页面。

为了获得页面刷新,我们需要在浏览器中安装LiveReload

开发者工具提供了许多属性,这些属性将被配置在应用程序的属性文件中以控制自动重启。

现在我们将提供一个例子,一步一步地使用开发者工具进行自动重启。

使用的软件

  1. Java 8
  2. Maven 3.3.9
  3. Spring Boot 1.4.3.RELEASE
  4. 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. 当我们创建一个JARWAR作为完全打包的应用程序并运行它时,开发人员工具就会自动被禁用。

2. 当我们使用java -jar或特殊类加载器运行应用程序时,它被认为是一个“生产项目(production application)”,开发工具将被自动禁用。

3. 最佳做法是设置为<optional>true</optional>,这样可以避免开发人员工具在其他模块上传递应用。Gradle目前不支持此功能。

4. 我们还可以在mavengradle中使用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图标并启用它。在启用它之前,确保mavenmvn spring-boot:run命令正在运行,这将启动tomcatLiveReload服务器。

自动重启

Spring boot的开发者工具有一个功能,每当类路径上的文件被修改,就会自动重启服务器并刷新浏览器页面。

一旦我们在mavengradle中配置了开发者工具,那么在eclipse中修改文件后,当我们保存时,自动重启功能就会启动。

所有在类路径中的文件都不需要服务器重启。

很多文件只需要在浏览器上刷新页面就可以完成任何修改。

当我们对java文件进行任何修改并保存时,服务器重启和浏览器刷新都需要。

有些文件不需要服务器重启,只需要在浏览器上刷新页面,例如静态页面、Thymeleaf模板、html页面等。

对于类路径上同样需要在浏览器上安装LiveReload的以下路径,Spring boot开发工具默认只在浏览器上执行页面刷新。

这些目录模式如下。

/META-INF/maven
/META-INF/resources
/resources
/static
/public
/templates

现在我们将用Spring MVCThymeleaf创建一个示例应用程序。这里我们还将创建一些不在类路径中的文件。找到项目结构。

位于类路径中的文件如下所示。
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.txttxtfile.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开发者工具进行自动重启和页面自动刷新

Spring Boot - 杂项

maven工程使用spring-boot-devtools进行热部署,更改代码避免重启web容器

maven工程使用spring-boot-devtools进行热部署,更改代码避免重启web容器

Maven项目:Spring Boot版本的办公自动化系统