环境说明

maven:v3.2+
spring-boot-maven-plugin:2.1.9
Idea:2019.03

插件介绍

spring-boot-maven-plugin  插件用于提供 spring boot 在 maven 中的支持。运行用户将项目打包成独立的可执行程序。
该插件中已经集成了丰富的  org.apache.maven  依赖与插件,具体可通过打开 pom 进行查看。
提供了以下(指 maven 构建)目标:

  1. run:运行 spring boot 应用;
  2. repackage:创建一个可执行的程序;
  3. start & stop:在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理;
  4. build-info:生成 Actuator 使用的构建信息文件 build-info.properties;

目标:repackage

一、可选配置:指定启动类

在不指定启动类的情况下,该插件会默认启动第一个找到的  public static void main(String[] args) 方法,当出现以下报错,表示找到不到启动类。

1
Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.1.9.RELEASE:repackage (repackage) on project interface: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.1.9.RELEASE:repackage failed: Unable to find main class

1. 非继承  spring-boot-starter-parent  的 pom

在插件的  configuration  属性中,通过  mainClass  指定启动类。

1
2
3
4
5
6
7
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${start-class}</mainClass>
</configuration>
</plugin>

2.  继承 spring-boot-starter-parent 的 pom

在 pom 配置 start-class 属性即可。

1
2
3
<properties>
<start-class>com.example.startup.Application1</start-class>
</properties>

这是因为在 spring-boot-starter-parent  中,已经对其进行了默认配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>${start-class}</mainClass>
</configuration>
</plugin>

二、可选配置:依赖排除

用于剔除不需要打包的依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 根据 groupId 以及 artifactId 排除依赖 -->
<excludeGroupIds>${groupId}</excludeGroupIds>
<excludes>
<!-- 根据 groupId 以及 artifactId 排除依赖 -->
<exclude>
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>

三、可选配置:分离器

默认情况下,repackage 构建目标会将打包好的项目再次打包变成可直执行程序,但是这样若是在多模块项目中,模块之间互相依赖,就需要使用分离器(classifier  属性),将依赖的内容和可执行程序分离,这样可以在打包时分别生成可依赖包和可执行程序。

1
2
3
4
5
6
7
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>

多模块打包问题

  • 如果不配置分离器,会在打包时提示:“找不到符号”或“应用程序不存在”;
  • 若插件配置在父模块中,则对于所有模块都会进行分离,而对于 spring 项目,可执行程序只需要包含启动类(如:startup 模块)即可,所以为了避免生成多余的可执行文件,可以只在 startup 模块中配置。

其他配置

一、自定义打包名称

直接使用 maven 的标准属性  fileName,即可。如:

1
2
3
<build>
<finalName>程序名称</finalName>
</build>

二、跳过单元测试

1. 配置属性

maven 默认在打包时会进行单元测试(这与 spring boot 无关),若要跳过,则需要在 pom 中配置  skipTests 属性,或  maven.test.skip  属性。区别是前者不进行测试但会编译,而后者直接忽略编译。

1
2
3
4
5
6
<properties>
<!-- 编译但不允许 -->
<skipTests>true</skipTests>
<!-- 跳过编译 -->
<maven.test.skip>true</maven.test.skip>
</properties>

这是由于 spring-boot-maven-plugin  内集成了  maven-surefire-plugin 插件,该插件专门用来处理 maven 中的单元测试。

2. 使用 Idea Maven 插件

选中 Idea 的 Maven 插件(通常处于有侧边栏)上的蓝色 ⚡ 按钮,即可跳过测试模块。
image.png

3. 自定义 Maven 命令

image.png

打包结果

若配置了分离器,则会生成两个 jar 包文件:

  • 可执行 jar 包:*.jar;
  • 可依赖 jar 包:*.original.jar

评论