把SpringBoot Maven项目打包成jar文件时,我们通常用到 spring-boot-maven-plugin 插件。
前面也介绍过,在spring-boot-starter-parent POM和spring-boot-starter POM中都有插件的管理,现在我们就撸一把构建元素中插件的用法。
一、spring-boot-maven-plugin 插件的使用
1、项目中spring-boot-maven-plugin插件的使用
project 标签指定项目的声明。modelVersion 标签指定POM模型的版本。目前使用的是4.0.0版本。这是Maven项目的根元素,定义了项目模型的版本。
parent 标签指定父项目信息,这里继承了spring-boot-starter-parent的pom。
build 标签指定项目的构建配置。它包含了多个子元素,如<plugins>、<resources>和<finalName>等等。
spring-boot-maven-plugin插件用于打包和运行Spring Boot应用。
2、spring-boot-starter POM中的spring-boot-maven-plugin
在这个pom里对spring-boot-maven-plugin插件的版本进行管理。
3、spring-boot-starter-parent POM中的spring-boot-maven-plugin
id 标签指定了此执行的唯一标识符 repackage。
goals 标签内定义了执行目标 goal 为 repackage。
mainClass 标签通过占位符 ${start-class} 来指定项目的主类,Maven会替换这个占位符为实际的主类。
从上面的文件可以看出来,在spring-boot-starter-parent POM中对spring-boot-maven-plugin插件的管理更加细化了。
由于在项目的pom里,我们继承了spring-boot-starter-parent的pom,spring-boot-starter-parent又继承了spring-boot-starter的pom,因此在项目的构建部分,我们可以直接引用 spring-boot-maven-plugin 插件,而不必再重复管理该插件的版本信息和一些构建信息。
二、<plugin> 插件
<plugins> 元素用于配置构建过程中使用的各种插件,它可以包含一个或多个<plugin> 标签。
<plugin> 元素是在构建生命周期的不同阶段执行的工具,它们可以执行各种任务,例如编译代码、运行测试、打包项目、生成报告等。
<plugin>插件子元素:
1、groupId: 指定插件的 groupId,标识插件的组织或提供者。
2、artifactId: 指定插件的 artifactId,标识插件的具体名称。
3、version: 指定插件的版本号。
4、extensions: 可选子元素。指示插件是否为 Maven 的核心扩展插件。默认值为 false。
如果未显式指定 extensions 属性,或者将其设置为 false,则表示插件不是 Maven 的核心扩展插件。这意味着 Maven 将插件作为标准插件处理,它们遵循标准的插件生命周期和行为。
如果将 extensions 属性显式设置为 true,则表示插件是 Maven 的核心扩展插件。这意味着插件可以在 Maven 构建中扩展或修改 Maven 的核心行为,通常用于提供额外的功能或集成。
5、dependencies: 指定插件在执行过程中所需的依赖项。
<dependencies>包含一个或多个 <dependencie> 元素,用于引入插件在执行过程中所需的依赖项。
6、executions: 描述插件执行的阶段和配置。
<executions>: 这个标签用于定义一个或多个插件的执行配置。
<execution>: 每个<execution>标签定义一个执行单元。可以在不同的构建阶段执行多个目标。
<execution>
<phase>package</phase> <!-- 指定Maven构建生命周期的阶段 -->
<goals>
<goal>jar</goal> <!-- 在package阶段执行jar目标 -->
<goal>jfxnative</goal> <!-- 在package阶段执行jfxnative目标 -->
</goals>
</execution>
<phase>package</phase>:指定了Maven生命周期的package阶段。在Maven的标准构建生命周期中,package阶段用于将编译后的代码打包成可分发格式(如JAR文件)。
<goal>jar</goal>:指示Maven在package阶段创建一个JAR文件。这个目标是由Maven的maven-jar-plugin插件提供的。
<goal>jfxnative</goal>: 指示Maven在package阶段创建一个本地可执行文件(如EXE文件)。这个目标是由javafx-maven-plugin插件提供的。jfxnative目标会使用javapackager或jpackage来生成本地可执行文件。
7、configuration: 用于配置插件在执行过程中的具体行为和参数,以定制插件的功能和行为。
configuration的两大作用:
7.1、传递参数: 插件可能需要某些参数来正确执行其功能。这些参数可以通过 configuration 元素传递给插件。
<source> 和<target>: 传递给编译插件的 Java 版本信息。
在上述例子中,<configuration> 元素用于向 Maven 编译器插件传递编译源代码的 Java 版本信息。
7.2、定制插件行为: 不同的插件支持不同的配置参数。通过 configuration 属性,你可以定制插件的行为以适应项目的特定需求。
7.2.1、基本类型参数: 如字符串、整数等,用于传递简单的配置信息。
<outputDirectory>target/classes</outputDirectory>
<verbose>true</verbose>
<includeSystemScope>true</includeSystemScope>
outputDirectory 标签指定插件输出的目录。
verbose 标签控制是否输出详细信息。
includeSystemScope 标签用于指定是否包括系统范围的依赖项(system scope dependencies)。系统范围的依赖项是那些指定了本地文件路径的依赖项,这些依赖项通常是一些特殊的、不可通过Maven仓库获取的库。
7.2、复杂类型参数: 如对象或嵌套配置,用于传递更复杂的配置信息。
<compilerArguments>
<arg>-Xlint:unchecked</arg>
</compilerArguments>
<encoding>UTF-8</encoding>
compilerArguments 标签指定传递给编译器插件的编译参数。
encoding 标签指定源文件编码格式。
7.3、集合类型参数: 用于传递列表或数组等复杂的数据结构。
<configuration>
<includes>
<include>**/*Tests.java</include>
</includes>
<excludes>
<exclude>**/SlowTests.java</exclude>
</excludes>
includes 标签指定哪些测试类被包括在测试中。
excludes 标签指定哪些测试类被排除在测试外。
skipTests 标签用于跳过测试执行。
plugin 标签里的子元素太多了,看不完根本看不完。还是用了再了解吧。
三、dependency 和 plugin 主要区别
dependency 和 plugin 有很多相似的地方,plugin 标签里也可以包含一个或多个dependency 标签。
四、构建阶段
在Maven项目中,构建过程是一组定义明确的活动或步骤,用于生成项目的最终输出(如JAR或WAR文件)。构建过程本身包括编译、测试、打包等多个阶段,但它不完全属于编译、测试或运行这三个阶段中的任何一个,而是涵盖了这些阶段中的一些或全部,以及其他额外的步骤。
1、编译阶段(Compile)
这是构建过程的开始,源代码被编译成字节码文件(.class文件)。这个阶段对应于Maven的 compile 生命周期阶段。
2、测试阶段(Test)
在这一阶段,项目的单元测试被执行,以验证代码的功能性。这通常对应于Maven的 test 生命周期阶段。测试阶段通常发生在编译阶段之后。
3、打包阶段(Package)
编译后的字节码和资源文件被打包成可分发的格式,如JAR、WAR或EAR文件。这一阶段对应于Maven的 package 生命周期阶段。
4、验证阶段(Verify)
在这一阶段,对打包的结果进行质量检查,可能包括运行集成测试、静态代码分析等。这一步骤确保打包的产品符合质量标准。
5、安装阶段(Install)
在这一阶段,打包的项目被安装到本地Maven仓库中,以便在该机器上的其他项目中使用。
6、部署阶段(Deploy)
在这一阶段,最终的包被上传到远程仓库中,供其他开发者和项目使用。
7、构建与编译、测试、运行的关系
编译:构建的一部分,确保代码无误并转换成机器可执行的形式。
测试:也是构建的一部分,用于验证功能和性能。
运行:通常指在开发完成后,产品被部署并实际运行的阶段。构建过程负责生成运行所需的所有代码和资源,但实际的运行通常发生在构建过程之外,特别是在生产环境中。
总的来说,构建过程是项目开发周期中非常关键的一部分,涵盖了从代码编译到产品部署的多个步骤,确保软件产品能够按预期构建和发布。
领取专属 10元无门槛券
私享最新 技术干货