Maven打包项目的精准指定——流程管理

news/2024/11/14 5:29:09/文章来源:https://www.cnblogs.com/ENchantedN/p/18541520

作用

        Maven不仅可以进行依赖管理的自动化,还可以自动化实现编译,打包,发布,等,也被成为构建流程

生命周期(lifecycle)

构成

        Maven生命周期本身可以看做一个集合,在这个集合中包含了一系列阶段(phase)。也就是说Maven的生命周期由一系列阶段(phase)构成

        但是话又说回来phase又是什么,Maven把打包的项目分为了很多个阶段,这个阶段就直接用了phase来表示,因为我们的需求是不同的,所以整个项目应该被打包到怎么个程度也是不同的,一个很形象的例子就是比如C语言的编译过程一样

C语言的编译有下面四个过程:

  1. 预处理
  2. 编译
  3. 汇编
  4. 链接

        Maven的打包阶段就像这几个过程一样,我们可以指定打包到那种程度,就像C语言我们让他编译到哪个程度,比如我们要编译到汇编的这个过程,不需要链接。这样就像我们运行mvn package,整个打包就会打包到package的程度。C语言编译的这四个过程就就如phase一样。

default生命周期

        这里我们可以来看下最常用的default周期是怎么样的

阶段名称 描述
validate 验证项目是否正确,所有必要的信息是否可用。
initialize 初始化构建环境,例如设置属性。
generate-sources 生成任何必须的源代码。
process-sources 处理源代码,例如过滤源代码中的值。
generate-resources 生成资源文件,如配置文件等。
process-resources 复制和处理资源到目标目录,准备打包。
compile 编译项目的源代码。
process-classes 处理编译生成的文件,例如字节码增强。
generate-test-sources 生成测试源代码。
process-test-sources 处理测试源代码。
generate-test-resources 生成测试资源文件。
process-test-resources 复制和处理测试资源到测试目标目录。
test-compile 编译测试源代码。
process-test-classes 处理测试编译生成的文件。
test 运行测试。
prepare-package 为打包阶段做准备。
package 把编译的代码和资源打包成可分发的格式,如JAR、WAR等。
pre-integration-test 在集成测试执行前准备环境。
integration-test 处理和部署项目到可以运行集成测试的环境。
post-integration-test 在集成测试执行后清理环境。
verify 运行任何检查,验证包是否有效。
install 安装包到本地仓库,以便其他项目可以作为依赖项使用。
deploy 将最终的包复制到远程仓库,供其他开发者和项目使用。

        如果我们运行mvn package,Maven就会执行default生命周期,它会从开始一直运行到package这个phase为止

        如果我们运行mvn compile,Maven也会执行default生命周期,但这次它只会运行到compile

clean生命周期

        当然我们不止default周期,还有很多周期,这里还介绍一下clean周期

  1. pre-clean - 这是 clean 生命周期的第一个阶段,用于执行任何在真正清理之前需要完成的工作。这个阶段可以用来做一些准备工作,比如备份文件或者检查是否有足够的权限来执行清理操作。
  2. clean - 这个阶段是 clean 生命周期的核心,它负责实际的清理工作。在这个阶段,Maven 会删除之前构建过程中生成的所有文件,例如编译生成的 .class 文件、测试结果、打包生成的 JAR 或 WAR 文件等。目的是清除所有构建产物,以便下一次构建时能从干净的状态开始。
  3. post-clean - 这是 clean 生命周期的最后一个阶段,用于执行清理之后需要完成的任务。这个阶段可以用来进行一些清理后的收尾工作,比如删除临时文件或者发送清理完成的通知。

        更复杂的例子是指定多个phase,例如,运行mvn clean package,Maven先执行clean生命周期并运行到clean这个phase,然后执行default生命周期并运行到package这个phase,实际执行的phase如下:

  • pre-clean
  • clean (注意这个clean是phase)
  • validate (开始执行default生命周期的第一个phase)
  • initialize
  • ...
  • prepare-package
  • package

在实际开发过程中,经常使用的命令有:

mvn clean:清理所有生成的class和jar;

mvn clean compile:先清理,再执行到compile

mvn clean test:先清理,再执行到test,因为执行test前必须执行compile,所以这里不必指定compile

mvn clean package:先清理,再执行到package

phase绑定的操作:goal

        每一个phase都有一个操作,但是这不代表说是phase在操作,而是里面包含的一个goal在操作,phase的下边可以绑定很多的goal,这样就使得phase能按照我们自己的想法来DIY phase的操作。这样也就是说phase其实也就是一个包含了goal的集合。

这个时候我们其实就能有一个具体的框架了

  1. Maven的流程框架中包含了很多个lifecycle
  2. 每一个的lifecycle都包含了很多个phase
  3. 每一个phase中又包含了很多个goal
  4. 最后goal包含的就是操作的代码

自定义插件

        我们前面说到,phase绑定的操作其实是在goal中的,很多时候自带的phase是无法满足我们的需求的,这个时候我们就需要能自定义goal,这个就是自定义插件解决的问题

自定义插件的配置

        一般来说,这样一个goal的配置是在pom.xml去配置的,这个文件都在你项目之中的image

1. 引入插件 (maven-shade-plugin)

        在 Maven 中,我们可以通过 <build><plugins> 标签来添加插件,这种插件声明告诉 Maven,我们在构建过程中需要一些标准操作以外的额外处理。

        如,maven-shade-plugin 是一个非标准插件,主要作用是将项目的所有依赖和源代码打包成一个“胖 jar”(fat jar)。这种 jar 文件包含项目的所有依赖,可以在任何支持 Java 的系统上直接运行。

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.1</version><!-- 插件的基本信息,指定 Maven 要引入的插件 --></plugin></plugins>
</build>

2. 设置插件的执行阶段和目标 (<executions>)

        <executions> 这个标签就定义了在哪个phase中实现我们的操作。每个阶段对应一组任务,比如 cleancompiletestpackageinstall 等。package 阶段是将项目打包成 jar 文件的阶段。

  • 执行阶段 (phase) :我们将插件的执行阶段设定为 package,这样当执行 mvn package 命令时,Maven 会在打包阶段运行 maven-shade-plugin
  • 执行目标 (goals)<goal>shade</goal> 指定了这个插件在 package 阶段的主要任务是将所有依赖打包进 jar 文件中。shademaven-shade-plugin 的一个默认目标,用于合并依赖项并生成胖 jar。
<executions><execution><phase>package</phase> <!-- 在 package 阶段执行 --><goals><goal>shade</goal> <!-- shade 目标用于合并依赖 --></goals></execution>
</executions>

3. 配置插件 (<configuration>)

        大部分自定义插件需要额外的配置项。maven-shade-plugin 的配置项主要用于指定打包时的行为。下面是该插件常见的几个配置项:

(a) <transformers>:用于修改 jar 文件的内容,尤其是资源文件的合并和 manifest 文件的配置。

        在 jar 文件中,Manifest.mf 文件存放着关于 jar 文件的元数据信息,比如版本号、开发者信息等。在可执行 jar 文件中,Manifest.mfMain-Class 字段决定了该 jar 的入口类(main)。配置 maven-shade-plugin<transformers> 标签,并使用 ManifestResourceTransformer,可以指定 jar 的主类。

(b) <mainClass>:指定主类

        <mainClass> 用于定义应用程序启动时所使用的主类。即当使用 java -jar your-app.jar 启动 jar 文件时,JVM 会从 <mainClass> 指定的类中寻找 public static void main(String[] args) 方法作为入口。

<configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.itranswarp.learnjava.Main</mainClass> <!-- 主类 --></transformer></transformers>
</configuration>

将这些元素组合在一起,我们得到了一个完整的 maven-shade-plugin 配置示例:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.1</version><executions><execution><phase>package</phase> <!-- package 阶段执行 --><goals><goal>shade</goal> <!-- shade 目标生成胖 jar --></goals><configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.itranswarp.learnjava.Main</mainClass> <!-- 主类指定 --></transformer></transformers></configuration></execution></executions></plugin></plugins>
</build>

        注意,Maven自带的标准插件例如compiler是无需声明的,只有引入其它的插件才需要声明。

下面列举了一些常用的插件:

  • maven-shade-plugin:打包所有依赖包并生成可执行jar;
  • cobertura-maven-plugin:生成单元测试覆盖率报告;
  • findbugs-maven-plugin:对Java源码进行静态分析以找出潜在问题。

自己实践使用maven-shade-plugin创建可执行jar遇到的问题日志

build的位置

        注意整个<build>标签是放在<project>里面就行

<groupId>的命名

        org.apache.maven.plugins这个id是maven官方的插件所以我们不用改

Main的路径

<transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.example.Main</mainClass> </transformer>
</transformers>

        每个人的main函数都不一样,但是只要指定对main函数的类就行

        如果这段代码有错的话你执行可执行文件会报错:.jar中没有主清单属性

使用mvn 指令后可执行文件的位置

        我在项目的根目录执行完mvn clean package后,整个输出都会在根目录下的target文件中,直接执行.jar文件就行

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

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

相关文章

如何正确导入mapstruct,同时避免编译时mapstruct与lombok冲突

本文介绍编译时产生的冲突,导包时期产生的冲突请劳驾查找其他解决方法一般情况下只需要按照官网的导入即可,但如果同时使用了lombok,则需要小心。详细信息可以查看官网文档:MapStruct 1.5.5.Final 集成lombok注意:在编译测试的时候,一定先清理再编译。这样可以解决80%的报…

施耐德UNITY下使用ST编程计算最近一小时的均值

昨晚学习练习了ST语言做最近60秒的分钟均值,今天继续做最近一小时的均值,1秒采集一次数据。在昨晚程序上增加功能,新建一个导出的功能块类型Average_Hour,定义下面的变量:旗下新建一个程序段Average_Hour,使用ST编程 Minute1:=BCD_TO_INT(%SW51);Minute:=mod_int(Minute1…

HyperWorks使用六面体和三棱柱单元进行实体网格剖分

本节将演示如何使用 solid map 功能对一个复杂的几何实体进行网格剖分。剖分的思路是:首先对该实体进行适当的切割,以使其各个部分均处于 mappable 的状态;然后分别对各个子块进行 solid map 剖分。事实上,针对同一个几何实体,可能有多种分块方案。究竟哪种方案能获得更高…

SQLSever将csv文件中的数据导入数据库中的某个表中的操作以及可能会出现的报错

注:导入数据前,检查一下数据类型是否与数据库中的数据类型相匹配 第一种方法: 首先打开SQLSever数据库,右击你的数据库找到任务后点开导入平面文件,如图 在弹开的窗口中点击下一步 接下来 填写完后点击下一步,跳转到预览数据的页面,会显示出表中的前20条数据,在检查没有…

云消息队列 Kafka 版全面升级:经济、弹性、稳定,成本比自建最多降低 82%

本文整理于 2024 年云栖大会阿里云智能集团产品专家张凤婷带来的主题演讲《云消息队列 Kafka 版全面升级:经济、弹性、稳定》作者:娜米 本文整理于 2024 年云栖大会阿里云智能集团产品专家张凤婷带来的主题演讲《云消息队列 Kafka 版全面升级:经济、弹性、稳定》 云原生消息…

Java定时任务大盘点:发工资也能“指日可待”

作者:京东保险 孙昊宇 引子:“指日可待”让我们先从一个成语开始,“指日可待”。没错,我说的就是定时任务😏。“指日可待”: 为任务指定好日程,就可以安心等待任务执行。在实际场景中,我们往往需要在特定时间做某件事情,或以某个时间间隔重复某件事情,如定期备份数据…

B端体验深耕-洞察用户需求,打造心有灵犀的使用体验

作者:京东科技 程跃宇前言 我们常以“心有灵犀”来形容与合作伙伴的默契配合,若我们的产品能与用户达到同样的默契,将极大地提升用户在任务旅程中的流畅体验。 在B端体验设计领域,我们深知用户对我们产品的期待───快速完成任务、即用即走;然而,随着业务需求和产品功能…

YLCTF RE

Round1 [Round 1] xor kail upx脱壳,一眼顶针,xor v5 = [0x45, 0x50, 0x5f, 0x48, 0x5a, 0x67, 0x7f, 0x2d, 0x2b, 0x7e, 0x24, 0x78, 0x2c, 0x24, 0x31, 0x2c, 0x7e, 0x78, 0x24,0x31, 0x28, 0x2d, 0x7a, 0x7d, 0x31, 0x7e, 0x25, 0x79, 0x2b, 0x31, 0x29, 0x79, 0x2a, 0x2f…

RAG应用性能优化全景图:从查询到生成的6个关键阶段

引言 检索增强生成(Retrieval-Augmented Generation,RAG)技术已成为大语言模型(LLM)应用开发中的关键组成部分。然而,构建高效、准确的RAG系统仍然面临诸多挑战。本文将深入探讨RAG开发的6个关键阶段,并分析每个阶段的优化策略,为开发者提供全面的性能优化指南。 RAG开…

html 空白汉字占位符

符号表示&nbsp; 英文半角空格不换行&#160; 英文半角空格不换行&#12288; 中文全角空格&ensp; 半角空格&#8194; 半角空格&#8195; 全角空格&emsp; 全角空格&#8197; 四分之一全角空格&#32; 英文半角空格连续的&nbsp;会在同一行内…

ABB机器人维修IRC5控制器结构剖析

"【ABB机器人维修IRC5控制器性能低】——描述:控制器性能低,并且似乎无法正常工作。ABB机器人控制柜没有完全 “ 死机 ”。——后果:可能会观察到这些症状:程序执行迟缓,看上去无法正常执行并且有时停止。——可能的原因:计算机系统负载过高,可能因为以下其中一个或…

《Django 5 By Example》阅读笔记:p17-p53

《Django 5 By Example》学习第2天,p17-p53总结,总计37页。 一、技术总结 1.数据库迁移 python manage.py makemigrations blog python manage.py sqlmigrate blog 0001 python manage.py migrate 2.ORM Django自带ORM。 3.view (1)定义 p42, A Django view is just a Python…