spring-boot-maven-plugin插件对Apache Maven提供Spring Boot支持,它允许你在运行集成测试之前打包可执行jar或war文件目录,运行spring boot应用程序,生成构建信息并启动spring boot应用。

Maven版本必须是3.6.3或更高版本。

一、简单使用示例
  • 要使用spring-boot-maven-plugin插件,请在pom xml的plugins插件部分包含相应的xml,如下所示:
<project>
	<modelVersion>4.0.0</modelVersion>
	<artifactId>getting-started</artifactId>
	<!-- ... -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>
  • Maven用户可以从spring-boot-starter-parent父项目中继承获得合适的默认值,示例如下:
<!-- Inherit defaults from Spring Boot -->
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>3.3.3</version>
</parent>

其中spring-boot-starter-parent的父pom是spring-boot-dependencies,用户在引入其它starter时可以不用指定对应的版本号。

  • springboot项目的pom不指定spring-boot-starter-parent对应的父pom

    ​ 你可能有理由不继承spring-boot-starter-parent作为父及POM,也可能是你有自己需要使用的公司标准父级,或者你更喜欢显示声明所有Maven配置。

    ​ 如果你不想使用spring-boot-starter-parent父级,你仍然可以通过使用导入范围的依赖关系来保持依赖关系(但不支持插件依赖管理)的好处,如下所示:

<dependencyManagement>
	<dependencies>
		<dependency>
			<!-- Import dependency management from Spring Boot -->
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-dependencies</artifactId>
			<version>3.3.3</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
二、spring-boot-maven-plugin插件有如下Goal(目标)

官网:https://docs.spring.io/spring-boot/maven-plugin/goals.html

目标描述
spring-boot:repackage重新打包现有的jar和war档案,以便可以使用java -jar用命令行执行,layout=NONE
可以用于打包具有嵌套依赖关系的jar(没有主类,因此不可以执行)
spring-boot:run立即运行应用程序
spring-boot:start启动spring应用程序,与运行goal(目标)run相反,这不会阻止并且允许其它goal在
应用程序上运行。此goal通常用于集成测试场景,其中应用程序在测试套件之前
启动,之后停止。
spring-boot:stop停止已由"start" goal启动的应用程序,统称在测试套件完成后调用。
三、打包可执行文件档案

该插件可以创建包含应用程序所有依赖项的可执行档案(jar文件和war文件),然后可以使用java -jar运行。

打包可执行档案由repackage goal执行,如下所示:

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<executions>
				<execution>
					<goals>
						<goal>repackage</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

repackage goal不可以在命令行上单独使用,因为它在package阶段生成的源jar(war)上运行。要在命令行上使用此goal,你必须包含package阶段:mvn package spring-boot:repackge。

如果你使用spring-boot-starter-parent,父级,则此类执行已经预先配置了repackage执行ID,因此只需添加插件定义。

三、重写MANIFEST.INF清单文件的Start-Class和Main-Class

spring-boot-maven-plugin插件会重写MANIFEST.INF清单文件,特别是管理的Start-Class和Main-Class条目,如果默认值不起作用,则必须配置spring boot 插件,而不是在jar插件,清单中的Main-Class是被spring boot插件的layout属性控制,如下示例:

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<mainClass>${start.class}</mainClass>
				<layout>ZIP</layout>
			</configuration>
			<executions>
				<execution>
					<goals>
						<goal>repackage</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

如下是一个MANIFEST.INF清单文件:

Manifest-Version: 1.0
Created-By: Maven JAR Plugin 3.3.0
Build-Jdk-Spec: 17
Main-Class: org.springframework.boot.loader.launch.JarLauncher
Start-Class: com.eastmoney.emis.App
Spring-Boot-Version: 3.3.3
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Spring-Boot-Layers-Index: BOOT-INF/layers.idx

layout属性默认由存档类型(jar或war)确定,以下layout属性值可用:

  • JAR:常规可执行JAR布局(spring boot plugin不指定layout属性的默认配置);
Manifest-Version: 1.0
Created-By: Maven JAR Plugin 3.3.0
Build-Jdk-Spec: 17
Main-Class: org.springframework.boot.loader.launch.JarLauncher
Start-Class: com.eastmoney.emis.App
Spring-Boot-Version: 3.3.3
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
  • WAR:可执行的WAR布局,提供的依赖项放置在WEB-INF/lib中,以避免在servlet容器中部署war时发生任何冲突;
Manifest-Version: 1.0
Created-By: Maven JAR Plugin 3.3.0
Build-Jdk-Spec: 17
Main-Class: org.springframework.boot.loader.launch.WarLauncher
Start-Class: com.eastmoney.emis.App
Spring-Boot-Version: 3.3.3
Spring-Boot-Classes: WEB-INF/classes/
Spring-Boot-Lib: WEB-INF/lib/
Spring-Boot-Classpath-Index: WEB-INF/classpath.idx
Spring-Boot-Layers-Index: WEB-INF/layers.idx
  • ZIP(别名是DIR):类似于JAR layout使用PropertiesLauncher;
Manifest-Version: 1.0
Created-By: Maven JAR Plugin 3.3.0
Build-Jdk-Spec: 17
Main-Class: org.springframework.boot.loader.launch.PropertiesLauncher
Start-Class: com.eastmoney.emis.App
Spring-Boot-Version: 3.3.3
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Spring-Boot-Layers-Index: BOOT-INF/layers.idx

  • NONE:捆绑所有依赖项和项目资源,不捆绑引导加载程序,即指定此类型的jar包不可执行;
Manifest-Version: 1.0
Created-By: Maven JAR Plugin 3.3.0
Build-Jdk-Spec: 17
Main-Class: com.eastmoney.emis.App
Spring-Boot-Version: 3.3.3
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Spring-Boot-Layers-Index: BOOT-INF/layers.idx

开源SDK:https://github.com/mingyang66/spring-parent

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐