说明
https://docs.spring.io/spring-boot/docs/3.2.0/maven-plugin/reference/htmlsingle/#run
Spring Boot maven插件有一个goal,可以从命令行拉起你的Spring Boot应用,如下:
$ mvn spring-boot:run
应用的参数可以通过插件的arguments
参数声明。
应用在一个派生的进程中执行,因此在命令行设置属性对应用不起作用。如果你想声明一些Java虚拟机参数(为了调试的目的),那么你需要用插件的jvmArguments
参数设置。另外,插件也有对系统属性和环境变量的明确支持。
因为启用一个profile是非常常见的场景,因此插件有一个专门的profiles
属性,提供了针对-Dspring-boot.run.jvmArguments="-Dspring.profiles.active=dev"
的一个快捷方式。
Spring Boot devtools
是一个模块,以提升在Spring Boot应用中的开发时体验。为了启用该工具,在你的项目中增加如下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
当devtools
在运行的时候,如果你重新编译你的应用,工具自动检测变化并且更新。这不仅对资源有效,对代码也有效。它也提供了一个LiveReload
服务器,因此在情况发生变化时触发浏览器刷新。devtools
也可以配置为仅仅当静态资源改变的时候(忽略任何在代码方面的改变)刷新浏览器,只要在你的项目中包含如下属性:
spring.devtools.remote.restart.enabled=false
在devtools
之前,插件默认支持资源的热更新,但现在默认是禁用的。你可以在你的项目中作如下配置来恢复它:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
如果启用了addResources
,当运行应用的时候,任何src/main/resources
目录会被增加到应用的类路径,并且在类输出发现的任何重复会被去掉,这允许资源的热更新。在开发web应用的时候非常有用。例如,你可以编辑HTML, CSS 或 JavaScript文件,不用重新编译你的应用就可以立即看到文件的改变。
注意:这一特性的副作用是在构建的时候对资源过滤不起作用。
为了与repackage
goal一致,run
goal用如下方式构建类路径:在插件配置中排除的任何依赖,也会从类路径中排除。
有时候,运行应用程序的一个测试变体是有用的。例如,如果你希望在开发时使用Testcontainers
,或者使用一些测试桩,可以运行 test-run
goal。这个goal有很多跟run
goal相同的特性和选项。
spring-boot:run
org.springframework.boot:spring-boot-maven-plugin:3.2.0
就地运行应用程序。
需要的参数
可选参数
spring-boot:test-run
org.springframework.boot:spring-boot-maven-plugin:3.2.0
利用测试运行时类路径就地运行一个应用。用来拉起应用的主类(main class)通过如下方法确定:
- 如果配置了main class,就使用它;
- 否则,如果测试类路径发现了main class,就使用它;
- 否则,用类路径上发现的main class。
需要的参数
可选参数
举例
调试应用
run
和 test-run
goal在一个派生的进程中运行你的应用。如果想调试应用,你应该增加一些必须的Java虚拟机参数来启用远程调试。下面的配置挂起进程,直到一个调试器(debugger)加入端口5005:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
</jvmArguments>
</configuration>
</plugin>
</plugins>
</build>
</project>
使用系统属性
系统属性可以通过插件的systemPropertyVariables
属性声明。下面的配置设置property1
的值为test
、property2
的值为42
:
<project>
<build>
<properties>
<my.value>42</my.value>
</properties>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<property1>test</property1>
<property2>${my.value}</property2>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
</project>
如果属性的值为空、或者没有定义(即象<my-property/>
这样),那么系统属性的值设置为一个空的字符串。
因为Maven会截去pom中声明的值的前面和后面的空格,因此,通过这种方法设置一个前面或者后面需要有空格的系统属性的值是行不通的,可以考虑使用插件的jvmArguments
属性。
任何字符串类型的maven变量可以作为系统属性传递。如果传递其它类型的maven变量(例如一个List、或URL变量),将会导致变量表达式按照字面传递(未赋值)。
jvmArguments
属性的优先级比按照上面方法定义的系统属性的优先级高。
利用环境变量
环境变量可以通过插件的environmentVariables
属性来声明。下面的例子设置了环境变量'ENV1', 'ENV2', 'ENV3', 'ENV4'
:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<environmentVariables>
<ENV1>5000</ENV1>
<ENV2>Some Text</ENV2>
<ENV3/>
<ENV4></ENV4>
</environmentVariables>
</configuration>
</plugin>
</plugins>
</build>
</project>
如果环境变量的值为空、或者没有设置(即,象<MY_ENV/>
这样),那么会被设置为一个空字符串。
因为Maven会截去pom中声明的值的前面和后面的空格,因此,通过这种方法设置一个前面或者后面需要有空格的变量的值是行不通的。
任何字符串类型的maven变量可以作为环境变量传递。如果传递其它类型的maven变量(例如一个List、或URL变量),将会导致变量表达式按照字面传递(未赋值)。
这种方法设置的环境变量的值比已经存在的值的优先级高。
使用应用参数
应用参数可以通过插件的arguments
属性声明。下面的例子设置了两个参数:property1
和property2=42
:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<arguments>
<argument>property1</argument>
<argument>property2=${my.value}</argument>
</arguments>
</configuration>
</plugin>
</plugins>
</build>
</project>
声明活动的profile
可以通过插件的profiles
属性设置应用启用的profile。下面例子的配置启用了local
和dev
两个profile:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<profiles>
<profile>local</profile>
<profile>dev</profile>
</profiles>
</configuration>
</plugin>
</plugins>
</build>
</project>