环境说明
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 | <plugin> |
2. 继承 spring-boot-starter-parent
的 pom
在 pom 配置 start-class
属性即可。
1 | <properties> |
这是因为在 spring-boot-starter-parent
中,已经对其进行了默认配置。
1 | <plugin> |
二、可选配置:依赖排除
用于剔除不需要打包的依赖。
1 | <plugin> |
三、可选配置:分离器
默认情况下,repackage 构建目标会将打包好的项目再次打包变成可直执行程序,但是这样若是在多模块项目中,模块之间互相依赖,就需要使用分离器(classifier
属性),将依赖的内容和可执行程序分离,这样可以在打包时分别生成可依赖包和可执行程序。
1 | <plugin> |
多模块打包问题
- 如果不配置分离器,会在打包时提示:“找不到符号”或“应用程序不存在”;
- 若插件配置在父模块中,则对于所有模块都会进行分离,而对于 spring 项目,可执行程序只需要包含启动类(如:startup 模块)即可,所以为了避免生成多余的可执行文件,可以只在 startup 模块中配置。
其他配置
一、自定义打包名称
直接使用 maven 的标准属性 fileName
,即可。如:
1 | <build> |
二、跳过单元测试
1. 配置属性
maven 默认在打包时会进行单元测试(这与 spring boot 无关),若要跳过,则需要在 pom 中配置 skipTests
属性,或 maven.test.skip
属性。区别是前者不进行测试但会编译,而后者直接忽略编译。
1 | <properties> |
这是由于 spring-boot-maven-plugin
内集成了 maven-surefire-plugin
插件,该插件专门用来处理 maven 中的单元测试。
2. 使用 Idea Maven 插件
选中 Idea 的 Maven 插件(通常处于有侧边栏)上的蓝色 ⚡ 按钮,即可跳过测试模块。
3. 自定义 Maven 命令
打包结果
若配置了分离器,则会生成两个 jar 包文件:
- 可执行 jar 包:*.jar;
- 可依赖 jar 包:*.original.jar