环境说明

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 构建)目标:

  • run:运行 spring boot 应用;
  • repackage:创建一个可执行的程序;
  • start & stop:在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理;
  • 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>

    多模块打包问题