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

img

在这个 pom 里对 spring-boot-maven-plugin 插件的版本进行管理。

3、spring-boot-starter-parent POM 中的 spring-boot-maven-plugin

img

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: 指定插件在执行过程中所需的依赖项。
包含一个或多个 元素,用于引入插件在执行过程中所需的依赖项。

6、executions: 描述插件执行的阶段和配置。
: 这个标签用于定义一个或多个插件的执行配置。
: 每个 < execution > 标签定义一个执行单元。可以在不同的构建阶段执行多个目标。

<executions>
    <execution>
        <phase>package</phase> <!-- 指定Maven构建生命周期的阶段 -->
        <goals>
            <goal>jar</goal> <!-- 在package阶段执行jar目标 -->
            <goal>jfxnative</goal> <!-- 在package阶段执行jfxnative目标 -->
        </goals>
    </execution>
</executions>

<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 标签。

img

四、构建阶段

在 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、构建与编译、测试、运行的关系

编译:构建的一部分,确保代码无误并转换成机器可执行的形式。

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948718.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE5AI感知组件

官方解释&#xff1a; AI感知系统为Pawn提供了一种从环境中接收数据的方式&#xff0c;例如噪音的来源、AI是否遭到破坏、或AI是否看到了什么。 AI感知组件&#xff08;AIPerception Component&#xff09;是用于实现游戏中的非玩家角色&#xff08;NPC&#xff09;对环境和其…

【数据仓库】hive on Tez配置

hive on Tez 搭建 前提是hive4.0hadoop3.2.2数仓已搭建完成&#xff0c;现在只是更换其执行引擎 为Tez。搭建可参考【数据仓库】hive hadoop数仓搭建实践文章。 Tez 下载 下载地址 https://archive.apache.org/dist/tez/ 官网地址 https://tez.apache.org/releases/apac…

finereport动态数据源插件教程2

场景&#xff1a; 模板中有多个数据集&#xff0c;只需要其中一个数据集按照不同的参数显示不同数据库的数据。 模板制作&#xff1a; 两个数据集ds1&#xff0c;ds2&#xff0c;ds1的绑定到参数面板的下拉框上&#xff0c;ds2显示到模板正文中&#xff0c;现在需要ds1根据不同…

Java通过谷歌邮箱Gmail直接发送邮件的三种方式

错误 Connected to the target VM, address: 127.0.0.1:52082, transport: socketException in thread "main" javax.mail.MessagingException: Got bad greeting from SMTP host: smtp.gmail.com, port: 587, response: [EOF] at com.sun.mail.smtp.SMTPTransp…

WSDM 2025 | 时间序列(time series)论文总结

AWSDM 2025于2025年3月10号到14号在德国汉诺威举行&#xff08;Hannover, Germany&#xff09; 本文总结了WSDM 2024有关时间序列&#xff08;time series&#xff09;的相关论文&#xff0c;如有疏漏&#xff0c;欢迎大家补充。&#xff08;没有时空数据相关的论文&#xff0…

反直觉导致卡关-迫击炮谜题

这个谜题&#xff0c;在两周目中先后卡了我至少三个小时&#xff0c;先后缓慢装填并发射迫击炮弹尝试了数百次。 一周目卡了很久&#xff0c;稀里糊涂的过了&#xff0c;想不到二周目还会卡那么久。 研究了很多播主的攻略&#xff0c;但还是一头雾水&#xff0c; 直到分析其…

庐山派K230学习日记4 PWM控制

1 本节介绍​ &#x1f4dd;本节您将学习如何通过将K230开发板的GPIO引脚复用为PWM功能并输出PWM信号&#xff1b;实现输出PWM信号及控制板载无源蜂鸣器发出声音。 &#x1f3c6;学习目标 1️⃣如何将GPIO引脚配置为PWM模式&#xff0c;通过40Pin排针中的部分引脚来输出PWM信号…

c语言的文件操作与文件缓冲区

目录 C语言文件操作函数汇总 简单介绍文件 为什么使用文件 什么是文件 文件名 二进制文件和文本文件 流和标准流 流 标准流 文件指针 文件的打开和关闭 文件的顺序读写 顺序读写函数介绍 文件的随机读写 fseek ftell rewind 文件读取结束的判定 文件缓冲区 缓…

嵌入式linux中socket控制与实现

一、概述 1、首先网络,一看到这个词,我们就会想到IP地址和端口号,那IP地址和端口各有什么作用呢? (1)IP地址如身份证一样,是标识的电脑的,一台电脑只有一个IP地址。 (2)端口提供了一种访问通道,服务器一般都是通过知名端口号来识别某个服务。例如,对于每个TCP/IP实…

Nginx:动静分离

什么是动静分离? 动静分离 是指将网站中的静态资源(如图片、样式表、脚本等)和动态内容(如 PHP、Python、Node.js 等后端生成的内容)分开部署和处理。这样做的好处是可以利用不同的服务器或缓存策略来优化不同类型的资源。 动静分离的好处 提高性能:静态资源可以直接从…

PADS Layout 差分线设计规则及其设计规则约束的详细过程步骤

一般我们的电路板有很多的差分线,有90欧姆的差分线,也有100欧姆的差分线,90欧姆的差分线主要是针对USB的差分线,特别是对于USB HUB的板子,那么我们就要设置差分线。一般我们设置差分线,一般要切换到Router里面来设置,如下所示: 那么设置差分对,一般要对原理图和Router…

计算机网络--路由表的更新

一、方法 【计算机网络习题-RIP路由表更新-哔哩哔哩】 二、举个例子 例1 例2

概述(讲讲python基本语法和第三方库)

我是北子&#xff0c;这是我自己写的python教程&#xff0c;主要是记录自己的学习成果方便自己日后复习&#xff0c; 我先学了C/C&#xff0c;所以这套教程中可能会将很多概念和C/C去对比&#xff0c;所以该教程大概不适合零基础的人。 it seems that python nowadays 只在人工…

redux用法总结

redux用法总结 目录 基本概念工作原理核心概念基本使用异步操作 Redux ThunkRedux Saga React 集成Redux Toolkit最佳实践 基本概念 什么是 Redux&#xff1f; Redux 是一个可预测的状态容器&#xff0c;用于管理 JavaScript 应用的状态。它遵循三个基本原则&#xff1a; …

Gitee上传项目代码教程(详细)

工具必备&#xff1a;Git Bash 上传步骤 1.在Gitee创建项目仓库 2.进入本地项目目录 右键打开Git Bash here 3.配置用户名和邮箱 如果之前给git配置过用户名和邮箱可跳过 查看Git是否配置成功&#xff1a;git config --list git config --global user.name "xxx"…

ARM CCA机密计算安全模型之安全生命周期管理

安全之安全(security)博客目录导读 目录 一、固件启用的调试 二、CCA系统安全生命周期 三、重新供应 四、可信子系统与CCA HES 启用 CCA&#xff08;机密计算架构&#xff09;的安全系统是指 CCA 平台的实现处于可信状态。 由于多种原因&#xff0c;CCA 启用系统可能处于不…

计算机视觉CV期末总复习

1.计算机视觉基础 数字图像表示 二值图像 仅包含黑白两种颜色的图像&#xff0c;只使用1个比特为&#xff08;0黑或1白&#xff09;表示 彩色图像&#xff1a;分不同的颜色空间 gray灰度图像 每个像素只有一个采样颜色&#xff0c;取值范围0--255&#xff0c;为8比特位&a…

web安全常用靶场

这里写自定义目录标题 phpstydy2018pikachuxss-labs phpstydy2018 网盘地址 提取码: nxnw ‌phpStudy是一款专为PHP开发者设计的集成环境工具&#xff0c;主要用于简化PHP开发环境的搭建过程。‌ 它集成了Apache、MySQL、PHP等核心组件&#xff0c;用户只需进行一次性安装&a…

每天40分玩转Django:Django实战 - 在线打印服务系统

Django实战 - 在线打印服务系统 一、系统功能概览表 模块主要功能技术要点文件上传PDF/Word文件上传、文件验证文件处理、MIME类型验证异步处理文件转换、打印队列Celery、Redis通知邮件打印状态通知、订单确认SMTP、邮件模板 二、系统架构设计 2.1 模型设计 # models.py …

WPS计算机二级•数据查找分析

听说这里是目录哦 通配符&#x1f30c;问号&#xff08;?&#xff09;星号&#xff08;*&#xff09;波形符&#xff08;~&#xff09; 排序&#x1f320;数字按大小排序以当前选定区域排序以扩展选定区域排序 文字按首字母排序 快速筛选分类数据☄️文字筛选数字筛选颜色筛选…