使用 Maven 运行你的应用

该插件包含一个 run 目标,可用于从命令行启动你的应用,如下例所示

$ mvn spring-boot:run

应用参数可以使用 arguments 参数指定,更多详情请参阅 使用应用参数

应用在单独的进程中执行,在命令行上设置属性不会影响应用。如果你需要指定一些 JVM 参数(例如用于调试),可以使用 jvmArguments 参数,更多详情请参阅 调试应用。还明确支持系统属性环境变量

由于启用 profile 非常常见,因此有一个专门的 profiles 属性,它提供了 -Dspring-boot.run.jvmArguments="-Dspring.profiles.active=dev" 的快捷方式,更多详情请参阅 指定活动 profile

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 目录都将添加到应用 classpath 中,并且 classes 输出中找到的任何重复文件将被移除。这允许资源的即时刷新,在开发 web 应用时非常有用。例如,你可以处理 HTML、CSS 或 JavaScript 文件,并立即看到你的更改而无需重新编译应用。这也是一种有用的方式,可以让你的前端开发人员无需下载和安装 Java IDE 即可工作。

使用此功能的一个副作用是构建时对资源的过滤将不起作用。

为了与 repackage 目标保持一致,run 目标会以这样一种方式构建 classpath,即插件配置中排除的任何依赖也会从 classpath 中排除。更多详情请参阅专用示例

有时运行应用的测试变体很有用。例如,如果你想在开发时使用 Testcontainers 或利用一些测试桩。为此,请使用 test-run 目标,它具有与 run 相同的许多特性和配置选项。

spring-boot:run

org.springframework.boot:spring-boot-maven-plugin:3.4.5

就地运行应用。

必需参数

名称 类型 默认值

classesDirectory

File

${project.build.outputDirectory}

可选参数

名称 类型 默认值

addResources

boolean

false

additionalClasspathElements

String[]

agents

File[]

arguments

String[]

commandlineArguments

String

environmentVariables

Map

excludeGroupIds

String

excludes

List

includes

List

jvmArguments

String

mainClass

String

noverify

boolean

optimizedLaunch

boolean

true

profiles

String[]

skip

boolean

false

systemPropertyVariables

Map

useTestClasspath

Boolean

false

workingDirectory

File

参数详情

addResources

将 Maven 资源直接添加到 classpath 中,这允许资源的即时就地编辑。从 target/classes 中移除重复资源,以防止在调用 ClassLoader.getResources() 时它们出现两次。请考虑将 spring-boot-devtools 添加到你的项目,因为它提供了此功能以及更多功能。

名称

addResources

类型

boolean

默认值

false

用户属性

spring-boot.run.addResources

始于

1.0.0

additionalClasspathElements

应添加到 classpath 中的额外 classpath 元素。一个元素可以是包含类和资源的目录,也可以是 jar 文件。

名称

additionalClasspathElements

类型

java.lang.String[]

默认值

用户属性

spring-boot.run.additional-classpath-elements

始于

3.2.0

agents

Agent jar 文件路径。

名称

agents

类型

java.io.File[]

默认值

用户属性

spring-boot.run.agents

始于

2.2.0

arguments

应传递给应用的参数。

名称

arguments

类型

java.lang.String[]

默认值

用户属性

始于

1.0.0

classesDirectory

包含用于运行应用的类文件和资源文件的目录。

名称

classesDirectory

类型

java.io.File

默认值

${project.build.outputDirectory}

用户属性

始于

1.0.0

commandlineArguments

应传递给应用的命令行参数。使用空格分隔多个参数,并确保将多个值用引号括起来。指定时,优先于 #arguments

名称

commandlineArguments

类型

java.lang.String

默认值

用户属性

spring-boot.run.arguments

始于

2.2.3

environmentVariables

应与用于运行应用的单独进程关联的环境变量列表。

名称

environmentVariables

类型

java.util.Map

默认值

用户属性

始于

2.1.0

excludeGroupIds

要排除的 groupId 名称的逗号分隔列表(精确匹配)。

名称

excludeGroupIds

类型

java.lang.String

默认值

用户属性

spring-boot.excludeGroupIds

始于

1.1.0

excludes

要排除的 artifact 定义集合。Exclude 元素定义了必需的 groupIdartifactId 组件以及一个可选的 classifier 组件。配置为属性时,值应使用冒号分隔的组件用逗号分隔:groupId:artifactId,groupId:artifactId:classifier

名称

excludes

类型

java.util.List

默认值

用户属性

spring-boot.excludes

始于

1.1.0

includes

要包含的 artifact 定义集合。Include 元素定义了必需的 groupIdartifactId 组件以及一个可选的 classifier 组件。配置为属性时,值应使用冒号分隔的组件用逗号分隔:groupId:artifactId,groupId:artifactId:classifier

名称

includes

类型

java.util.List

默认值

用户属性

spring-boot.includes

始于

1.2.0

jvmArguments

应与用于运行应用的单独进程关联的 JVM 参数。在命令行上,确保将多个值用引号括起来。

名称

jvmArguments

类型

java.lang.String

默认值

用户属性

spring-boot.run.jvmArguments

始于

1.1.0

mainClass

主类的名称。如果未指定,将使用找到的第一个包含 'main' 方法的已编译类。

名称

mainClass

类型

java.lang.String

默认值

用户属性

spring-boot.run.main-class

始于

1.0.0

noverify

指示 agent 需要 -noverify 的标志。

名称

noverify

类型

boolean

默认值

用户属性

spring-boot.run.noverify

始于

1.0.0

optimizedLaunch

是否应优化 JVM 的启动。

名称

optimizedLaunch

类型

boolean

默认值

true

用户属性

spring-boot.run.optimizedLaunch

始于

2.2.0

profiles

要激活的 Spring profile。指定 'spring.profiles.active' 参数的便捷快捷方式。在命令行上使用逗号分隔多个 profile。

名称

profiles

类型

java.lang.String[]

默认值

用户属性

spring-boot.run.profiles

始于

1.3.0

skip

跳过执行。

名称

skip

类型

boolean

默认值

false

用户属性

spring-boot.run.skip

始于

1.3.2

systemPropertyVariables

要传递给进程的 JVM 系统属性列表。

名称

systemPropertyVariables

类型

java.util.Map

默认值

用户属性

始于

2.1.0

useTestClasspath

运行时是否包含测试 classpath 的标志。

名称

useTestClasspath

类型

java.lang.Boolean

默认值

false

用户属性

spring-boot.run.useTestClasspath

始于

1.3.0

workingDirectory

应用使用的当前工作目录。如果未指定,将使用 basedir。

名称

workingDirectory

类型

java.io.File

默认值

用户属性

spring-boot.run.workingDirectory

始于

1.5.0

spring-boot:test-run

org.springframework.boot:spring-boot-maven-plugin:3.4.5

使用测试运行时 classpath 就地运行应用。用于启动应用的主类确定顺序如下:如果配置了主类,则使用配置的主类。然后,如果在测试类目录中找到主类,则使用该主类。然后,如果在类目录中找到主类,则使用该主类。

必需参数

名称 类型 默认值

classesDirectory

File

${project.build.outputDirectory}

testClassesDirectory

File

${project.build.testOutputDirectory}

可选参数

名称 类型 默认值

addResources

boolean

false

additionalClasspathElements

String[]

agents

File[]

arguments

String[]

commandlineArguments

String

environmentVariables

Map

excludeGroupIds

String

excludes

List

includes

List

jvmArguments

String

mainClass

String

noverify

boolean

optimizedLaunch

boolean

true

profiles

String[]

skip

boolean

false

systemPropertyVariables

Map

workingDirectory

File

参数详情

addResources

将 Maven 资源直接添加到 classpath 中,这允许资源的即时就地编辑。从 target/classes 中移除重复资源,以防止在调用 ClassLoader.getResources() 时它们出现两次。请考虑将 spring-boot-devtools 添加到你的项目,因为它提供了此功能以及更多功能。

名称

addResources

类型

boolean

默认值

false

用户属性

spring-boot.run.addResources

始于

1.0.0

additionalClasspathElements

应添加到 classpath 中的额外 classpath 元素。一个元素可以是包含类和资源的目录,也可以是 jar 文件。

名称

additionalClasspathElements

类型

java.lang.String[]

默认值

用户属性

spring-boot.run.additional-classpath-elements

始于

3.2.0

agents

Agent jar 文件路径。

名称

agents

类型

java.io.File[]

默认值

用户属性

spring-boot.run.agents

始于

2.2.0

arguments

应传递给应用的参数。

名称

arguments

类型

java.lang.String[]

默认值

用户属性

始于

1.0.0

classesDirectory

包含用于运行应用的类文件和资源文件的目录。

名称

classesDirectory

类型

java.io.File

默认值

${project.build.outputDirectory}

用户属性

始于

1.0.0

commandlineArguments

应传递给应用的命令行参数。使用空格分隔多个参数,并确保将多个值用引号括起来。指定时,优先于 #arguments

名称

commandlineArguments

类型

java.lang.String

默认值

用户属性

spring-boot.run.arguments

始于

2.2.3

environmentVariables

应与用于运行应用的单独进程关联的环境变量列表。

名称

environmentVariables

类型

java.util.Map

默认值

用户属性

始于

2.1.0

excludeGroupIds

要排除的 groupId 名称的逗号分隔列表(精确匹配)。

名称

excludeGroupIds

类型

java.lang.String

默认值

用户属性

spring-boot.excludeGroupIds

始于

1.1.0

excludes

要排除的 artifact 定义集合。Exclude 元素定义了必需的 groupIdartifactId 组件以及一个可选的 classifier 组件。配置为属性时,值应使用冒号分隔的组件用逗号分隔:groupId:artifactId,groupId:artifactId:classifier

名称

excludes

类型

java.util.List

默认值

用户属性

spring-boot.excludes

始于

1.1.0

includes

要包含的 artifact 定义集合。Include 元素定义了必需的 groupIdartifactId 组件以及一个可选的 classifier 组件。配置为属性时,值应使用冒号分隔的组件用逗号分隔:groupId:artifactId,groupId:artifactId:classifier

名称

includes

类型

java.util.List

默认值

用户属性

spring-boot.includes

始于

1.2.0

jvmArguments

应与用于运行应用的单独进程关联的 JVM 参数。在命令行上,确保将多个值用引号括起来。

名称

jvmArguments

类型

java.lang.String

默认值

用户属性

spring-boot.run.jvmArguments

始于

1.1.0

mainClass

主类的名称。如果未指定,将使用找到的第一个包含 'main' 方法的已编译类。

名称

mainClass

类型

java.lang.String

默认值

用户属性

spring-boot.run.main-class

始于

1.0.0

noverify

指示 agent 需要 -noverify 的标志。

名称

noverify

类型

boolean

默认值

用户属性

spring-boot.run.noverify

始于

1.0.0

optimizedLaunch

是否应优化 JVM 的启动。

名称

optimizedLaunch

类型

boolean

默认值

true

用户属性

spring-boot.test-run.optimizedLaunch

始于

profiles

要激活的 Spring profile。指定 'spring.profiles.active' 参数的便捷快捷方式。在命令行上使用逗号分隔多个 profile。

名称

profiles

类型

java.lang.String[]

默认值

用户属性

spring-boot.run.profiles

始于

1.3.0

skip

跳过执行。

名称

skip

类型

boolean

默认值

false

用户属性

spring-boot.run.skip

始于

1.3.2

systemPropertyVariables

要传递给进程的 JVM 系统属性列表。

名称

systemPropertyVariables

类型

java.util.Map

默认值

用户属性

始于

2.1.0

testClassesDirectory

包含用于运行应用的测试类文件和资源文件的目录。

名称

testClassesDirectory

类型

java.io.File

默认值

${project.build.testOutputDirectory}

用户属性

始于

workingDirectory

应用使用的当前工作目录。如果未指定,将使用 basedir。

名称

workingDirectory

类型

java.io.File

默认值

用户属性

spring-boot.run.workingDirectory

始于

1.5.0

示例

调试应用

runtest-run 目标在单独的进程中运行你的应用。如果你需要调试它,应添加必要的 JVM 参数以启用远程调试。以下配置将暂停进程,直到调试器连接到端口 5005

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<jvmArguments>
						-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005
					</jvmArguments>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

这些参数也可以在命令行上指定

$ mvn spring-boot:run -Dspring-boot.run.jvmArguments=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005

使用系统属性

可以使用 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

任何 String 类型的 Maven 变量都可以作为系统属性传递。任何尝试传递任何其他 Maven 变量类型(例如 ListURL 变量)的操作将导致变量表达式被按字面意义(未评估)传递。

jvmArguments 参数优先于使用上述机制定义的系统属性。在以下示例中,property1 的值被 overridden

$ mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dproperty1=overridden"

使用环境变量

可以使用 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 中指定的值,因此无法指定以空格开头或结尾的环境变量。

任何 String 类型的 Maven 变量都可以作为系统属性传递。任何尝试传递任何其他 Maven 变量类型(例如 ListURL 变量)的操作将导致变量表达式被按字面意义(未评估)传递。

以这种方式定义的环境变量优先于现有值。

使用应用参数

可以使用 arguments 属性指定应用参数。以下示例设置了两个参数:property1property2=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>

在命令行上,参数与 jvmArguments 一样用空格分隔。如果参数包含空格,请确保用引号将其括起来。在以下示例中,有两个可用参数:property1property2=Hello World

$ mvn spring-boot:run -Dspring-boot.run.arguments="property1 'property2=Hello World'"

指定活动 Profile

可以使用 profiles 参数指定特定应用要使用的活动 profile。

以下配置启用了 localdev 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>

要启用的 profile 也可以在命令行上指定,请确保使用逗号分隔它们,如下例所示

$ mvn spring-boot:run -Dspring-boot.run.profiles=local,dev