SpringBoot Maven 项目 pom 中的 plugin 插件用法整理

把 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">  
<modelVersion>4.0.0</modelVersion>
<parent><!--父项目-->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<!--项目基本信息、父项目信息、依赖、自定义属性等等...-->
    <build><!--构建元素-->
        <plugins><!--插件引入-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <finalName>xxx</finalName> <!--jar的名称-->
    </build>
</project>

project 标签指定项目的声明。modelVersion 标签指定 POM 模型的版本。目前使用的是 4.0.0 版本。这是 Maven 项目的根元素,定义了项目模型的版本。

parent 标签指定父项目信息,这里继承了 spring-boot-starter-parent 的 pom。

build 标签指定项目的构建配置。它包含了多个子元素,如 、 和 < 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> 插件

元素用于配置构建过程中使用的各种插件,它可以包含一个或多个 < plugin> 标签。

元素是在构建生命周期的不同阶段执行的工具,它们可以执行各种任务,例如编译代码、运行测试、打包项目、生成报告等。

插件子元素:

1、groupId: 指定插件的 groupId,标识插件的组织或提供者。

2、artifactId: 指定插件的 artifactId,标识插件的具体名称。

3、version: 指定插件的版本号。

4、extensions: 可选子元素。指示插件是否为 Maven 的核心扩展插件。默认值为 false。

复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <!-- extensions 默认为 false -->
</plugin>

如果未显式指定 extensions 属性,或者将其设置为 false,则表示插件不是 Maven 的核心扩展插件。这意味着 Maven 将插件作为标准插件处理,它们遵循标准的插件生命周期和行为。

复制代码
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
    <extensions>true</extensions>
</plugin>

如果将 extensions 属性显式设置为 true,则表示插件是 Maven 的核心扩展插件。这意味着插件可以在 Maven 构建中扩展或修改 Maven 的核心行为,通常用于提供额外的功能或集成。

5、dependencies: 指定插件在执行过程中所需的依赖项。

包含一个或多个 元素,用于引入插件在执行过程中所需的依赖项。

: 这个标签用于定义一个或多个插件的执行配置。

: 每个 < execution > 标签定义一个执行单元。可以在不同的构建阶段执行多个目标。

复制代码
package jar jfxnative

<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 元素传递给插件。

复制代码
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>

<source>< target>: 传递给编译插件的 Java 版本信息。

在上述例子中,<configuration> 元素用于向 Maven 编译器插件传递编译源代码的 Java 版本信息。

7.2、定制插件行为: 不同的插件支持不同的配置参数。通过 configuration 属性,你可以定制插件的行为以适应项目的特定需求。

7.2.1、基本类型参数: 如字符串、整数等,用于传递简单的配置信息。

复制代码
<configuration>
    <outputDirectory>target/classes</outputDirectory>
    <verbose>true</verbose>
    <includeSystemScope>true</includeSystemScope>
</configuration>

outputDirectory 标签指定插件输出的目录。

verbose 标签控制是否输出详细信息。

includeSystemScope 标签用于指定是否包括系统范围的依赖项(system scope dependencies)。系统范围的依赖项是那些指定了本地文件路径的依赖项,这些依赖项通常是一些特殊的、不可通过 Maven 仓库获取的库。

7.2、复杂类型参数: 如对象或嵌套配置,用于传递更复杂的配置信息。

复制代码
<configuration>
    <compilerArguments>
        <arg>-Xlint:unchecked</arg>
    </compilerArguments>
    <encoding>UTF-8</encoding>
</configuration>

compilerArguments 标签指定传递给编译器插件的编译参数。

encoding 标签指定源文件编码格式。

7.3、集合类型参数: 用于传递列表或数组等复杂的数据结构。

复制代码
<configuration>   
<skipTests>true</skipTests>
        <includes>
            <include>**/*Tests.java</include>
        </includes>
        <excludes>
            <exclude>**/SlowTests.java</exclude>
        </excludes>
</configuration>

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、构建与编译、测试、运行的关系
编译:构建的一部分,确保代码无误并转换成机器可执行的形式。

测试:也是构建的一部分,用于验证功能和性能。

运行:通常指在开发完成后,产品被部署并实际运行的阶段。构建过程负责生成运行所需的所有代码和资源,但实际的运行通常发生在构建过程之外,特别是在生产环境中。

总的来说,构建过程是项目开发周期中非常关键的一部分,涵盖了从代码编译到产品部署的多个步骤,确保软件产品能够按预期构建和发布。

相关推荐
uzong2 小时前
技术故障复盘模版
后端
GetcharZp2 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程2 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研2 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi3 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
一只爱撸猫的程序猿3 小时前
使用Spring AI配合MCP(Model Context Protocol)构建一个"智能代码审查助手"
spring boot·aigc·ai编程
甄超锋4 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国4 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy4 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
AntBlack4 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt