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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot | 使用Apache POI库读取Excel文件介绍

关注WX&#xff1a;CodingTechWork 介绍 在日常开发中&#xff0c;我们经常需要处理Excel文件中的数据。无论是从数据库导入数据、处理数据报表&#xff0c;还是批量生成数据&#xff0c;都可能会遇到需要读取和操作Excel文件的场景。本文将详细介绍如何使用Java中的Apache PO…

Markdown类图的用法

Markdown类图的用法 1. 前言2. 语法详解2.1 类图的[类]2.2 类图中的关系2.3 类修饰符 使用场景及实例注意小结其他文章快来试试吧&#x1f970; Markdown类图的用法 &#x1f448;点击这里也可查看 1. 前言 Markdown 的原生语法不支持绘制图形&#xff0c;但通过扩展模块&…

c和c++中为什么要防止头文件被重复包含!

在编程中&#xff0c;头文件就像一本工具书&#xff0c;它包含了函数、类、宏、全局变量等的定义和声明&#xff0c;供其他代码文件引用。想象一下&#xff0c;如果你在写一篇文章时&#xff0c;反复引用同一本工具书的内容&#xff0c;会发生什么情况呢&#xff1f; 1. 避免重…

Compression Techniques for LLMs

Compression Techniques for LLMs 随着大型语言模型&#xff08;LLMs&#xff09;的迅速发展&#xff0c;提高其计算效率和存储效率成为研究的重要方向。为了实现这一目标&#xff0c;诸多压缩技术应运而生。本文将深入探讨几种有效的压缩技术&#xff0c;这些技术不仅能够降低…

django vue3实现大文件分段续传(断点续传)

前端环境准备及目录结构&#xff1a; npm create vue 并取名为big-file-upload-fontend 通过 npm i 安装以下内容"dependencies": {"axios": "^1.7.9","element-plus": "^2.9.1","js-sha256": "^0.11.0&quo…

Oracle 11g rac + Dataguard 环境调整 redo log 大小

Oracle 11g rac Dataguard 环境调整 redo log 大小 目录 Oracle 11g rac Dataguard 环境调整 redo log 大小一、问题的产生1、查看日志文件、日志组信息2、日志切换较快出现的问题 二、 确认 DG 同步是否正常1、检查数据库角色2、查看进程信息3、检查归档是否一致4、查看 GAP…

MCP(Model Context Protocol)模型上下文协议 进阶篇3 - 传输

MCP 目前定义了两种标准的客户端-服务端通信传输机制&#xff1a; stdio&#xff08;标准输入输出通信&#xff09;HTTP with Server-Sent Events (SSE)&#xff08;HTTP 服务端发送事件&#xff09; 客户端应尽可能支持 stdio。此外&#xff0c;客户端和服务端也可以以插件方…

Laravel操作ElasticSearch

在Laravel项目中操作ElasticSearch可以通过以下步骤来实现&#xff0c;通常会借助相应的ElasticSearch客户端扩展包。 ### 安装ElasticSearch客户端包 在Laravel项目中&#xff0c;常用的是 elasticsearch/elasticsearch 这个PHP客户端库来与ElasticSearch进行交互&#xff0c…

openai swarm agent框架源码详解及应用案例实战

文章目录 简介数据类型Agent类Response类Result类Swarm类run_demo_loop交互式会话 基础应用agent-handsofffunction-callingcontext_variablestriage_agent 高阶应用通用客服机器人(support bot)构建航班服务agent 参考资料 openai 在24年10月份开源了一个教育性质的多agents协…

【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 2:基础知识

目录 1 预热1.1 记号1.2 分类器计算过载问题 2 多头编码&#xff08;MHE&#xff09;2.1 标签分解2.2 多头组合&#xff08;Multi-Head Combination&#xff09; 论文&#xff1a;Multi-Head Encoding for Extreme Label Classification 作者&#xff1a;Daojun Liang, Haixia …

FTP上传下传、SFTP上传下传、进度监控、断点续传、连接池封装JAVA一网打尽(五)SFTP进阶篇【5/5】【完结篇】

一、摘要&#xff08;本系列汇总说明&#xff09; - 总纲 FTP、SFTP上传下传、进度监控、断点续传、连接池封装JAVA一网打尽&#xff08;一&#xff09; FTP、SFTP上传下传、进度监控、断点续传、连接池封装JAVA一网打尽&#xff08;二&#xff09; FTP、SFTP上传下传、进度监…

攻防世界 - Misc - Level 1 | 适合作为桌面

关注这个靶场的其它相关笔记&#xff1a;攻防世界&#xff08;XCTF&#xff09; —— 靶场笔记合集-CSDN博客 0x01&#xff1a;考点速览 想要通过本关&#xff0c;你需要掌握以下知识点&#xff1a; Stegolve 查看图片隐写内容。 了解 pyc 文件&#xff0c;并知道如何通过 Wi…

Unity 从零开始的框架搭建1-3 关于命令模式的一些思考

Unity 从零开始的框架搭建1-2 事件的发布-订阅-取消的小优化及调用对象方法总结[半干货]-CSDN博客 本人水平有限 如有不足还请斧正&#xff0c;该文章专栏是向QFrameWork作者凉鞋老师学习总结得来&#xff0c;吃水不忘打井人&#xff0c;不胜感激 关于此模式我曾实现过&#…

UVM :uvm_sequence_item property and methods

transaction是uvm_sequence_item的一个子类。 topic transaction介绍 uvm_sequence_item override Set_type_override:同类型替换 Set_inst_override:同例化替换

SpringBoot原理分析-1

SpringBoot原理分析 作为一个javaer&#xff0c;和boot打交道是很常见的吧。熟悉boot的人都会知道&#xff0c;启动一个springboot应用&#xff0c;就是用鼠标点一下启动main方法&#xff0c;然后等着就行了。我们来看看这个main里面。 SpringBootApplication public class E…

前端(API)学习笔记(CLASS 4):进阶

1、日期对象 日期对象&#xff1a;用来表示事件的对象 作用&#xff1a;可以得到当前系统时间 1、实例化 在代码中发现了new关键字&#xff0c;一般将这个操作称为实例化 创建一个时间对象并获取时间 获得当前时间 const datenew Date() 使用日志查看&#xff0c;得到的…

力扣刷题:二叉树OJ篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 1.单值二叉树&#xff08;1&#xff09;题目描…

4.1.2 栈和队列(二)

文章目录 队列的定义队列的基本运算队列的存储结构 队列的定义 队列先进先出&#xff0c;仅允许一端插入、一端删除 队尾(Rear)&#xff0c;插入 队头(Front)&#xff0c;删除 队列的基本运算 队列的基本运算 初始化空队列&#xff1a;initQueue(Q)判队空&#xff1a;isEmpty…

【HeadFirst系列之HeadFirst设计模式】第1天之HeadFirst设计模式开胃菜

HeadFirst设计模式开胃菜 前言 从今日起&#xff0c;陆续分享《HeadFirst设计模式》的读书笔记&#xff0c;希望能够帮助大家更好的理解设计模式&#xff0c;提高自己的编程能力。 今天要分享的是【HeadFirst设计模式开胃菜】&#xff0c;主要介绍了设计模式的基本概念、设计模…

Oracle数据库如何找到 Top Hard Parsing SQL 语句?

有一个数据库应用程序存在过多的解析问题&#xff0c;因此需要找到产生大量硬解析的主要语句。 什么是硬解析 Oracle数据库中的硬解析&#xff08;Hard Parse&#xff09;是指在执行SQL语句时&#xff0c;数据库需要重新解析该SQL语句&#xff0c;并创建新的执行计划的过程。这…