maven 以及插件重写的一些思考

2024-09-01 00:20
文章标签 maven 思考 重写 插件

本文主要是介绍maven 以及插件重写的一些思考,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先简单了解一下maven:
https://maven.org.cn/maven-features.html
下面是maven的各个阶段的一些信息,由于已经存在,直接查看GPT的解释:

maven的主要阶段包含 installtestdeploypackage 等。这些阶段属于 Maven 的
default(或 build)生命周期。下面是对这些关键阶段的详细介绍:

1. validate

  • 作用:验证项目是否正确且所有必要的信息是否可用。
  • 用途:确保 POM 文件中的配置正确、必要的参数已经设置等。

2. compile

  • 作用:编译项目的主源代码。
  • 用途:将 src/main/java 目录下的 Java 源文件编译成 .class 文件,并放在 target/classes 目录中。

3. test-compile

  • 作用:编译测试源代码。
  • 用途:将 src/test/java 目录下的测试源文件编译成 .class 文件。

4. test

  • 作用:运行测试代码。
  • 用途:使用测试框架(如 JUnit)运行编译后的测试代码。测试结果会生成在 target/surefire-reports 目录中。
  • 注意:测试阶段只会运行那些标记为测试的代码,并确保代码逻辑符合预期。

5. package

  • 作用:将编译后的代码打包成可分发的格式。
  • 用途:生成如 JAR、WAR 或其他可分发格式的文件。打包后的文件通常位于 target 目录中。

6. verify

  • 作用:运行任何检查,验证包是否有效且符合质量标准。
  • 用途:在 testpackage 之后执行的额外检查,确保生成的包满足要求。

7. install

  • 作用:将生成的包安装到本地 Maven 仓库。
  • 用途:将包(如 JAR 或 WAR)复制到本地仓库,以便其他本地 Maven 项目可以使用该包作为依赖。默认情况下,本地仓库位于用户主目录下的 .m2/repository 目录。

8. deploy

  • 作用:将最终的包复制到远程仓库。
  • 用途:将包发布到远程 Maven 仓库(如 Maven Central 或企业内部的私有仓库),以便其他开发者或项目可以使用这个包。通常在 CI/CD 流程中使用这个阶段来自动化发布过程。

生命周期阶段的顺序和依赖关系

  • 依赖顺序:当你运行 mvn install 时,Maven 会自动执行从 validateinstall 之间的所有阶段。
  • 组合调用:例如,mvn deploy 会执行 validatecompiletestpackageverifyinstalldeploy
    这些阶段。

实际使用示例 假设你在命令行中运行 mvn install,Maven 会按顺序执行以下阶段:

  1. validate:检查项目是否配置正确。
  2. compile:编译主代码。
  3. test-compile:编译测试代码。
  4. test:运行测试。
  5. package:将项目打包成 JAR 或 WAR 文件。
  6. install:将打包文件安装到本地 Maven 仓库。

运行 mvn deploy 会在执行上述阶段后,将包部署到远程仓库。

通过这种方式,Maven 提供了一个统一的构建和发布流程,帮助开发者有效地管理项目的整个生命周期。

我们最近基于自己的项目需要重构maven的打包逻辑,即服用之前的编译等逻辑但是手动修改maven的package插件,使用@Mojo注解将complie好的类进行

Maven plugins can be written in Java or any of a number of scripting
languages. Plugins consists of one or more Mojos, each one being the
implementation for one of the plugin’s goals.
https://maven.apache.org/developers/mojo-api-specification.html

关于@Mojo的一些参数之类的不过多赘述,在互联网上可以找到很多的资料,想记录一些之前没有思考过的知识点:
1.maven在deploy的时候会对子maven也进行deploy然后会对自己进行deploy,在我们之前的实践中,存在这样一种情况,正常情况下,假如存在这样一个maven项目:
parent-project
│ pom.xml

├── module-a
│ └── pom.xml

├── module-b
│ └── pom.xml

└── module-c
└── pom.xml

如果我们正常的执行maven的deploy逻辑,实际上会先对module abc分别进行deploy然后会对parent- project进行一个整体的deploy逻辑,得到四个jar包,但是我们因为一些业务逻辑想要对abc本身打包成一个a.jar 然后对module abc的依赖进行一个整体的打包得到一个dependency.jar,然后对于这两个jar
那怎么实现这个呢?先了解一下assembly.xml
https://maven.apache.org/guides/mini/guide-assemblies.html

assembly.xml 是 Maven Assembly 插件的配置文件,用于定义如何将项目的构件(如 JAR、WAR 文件)和依赖项、资源文件等打包成一个分发包(如 ZIP、TAR.gz 等)。这个文件允许我们自定义打包的内容和结构,以便将整个项目及其依赖项一起分发。
举个例子

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"><!-- 定义这个 assembly 的唯一标识符,用于生成的文件名的一部分 --><id>distribution</id><!-- 定义输出的打包格式,这里指定为 ZIP 格式 --><formats><format>zip</format></formats><!-- 是否在生成的包中包含一个顶级目录 --><includeBaseDirectory>true</includeBaseDirectory><!-- 定义文件集,指定要包含在包中的目录和目标路径 --><fileSets><fileSet><!-- 要打包的源文件目录 --><directory>src/main/resources</directory><!-- 在生成的包中的输出路径 --><outputDirectory>/resources</outputDirectory></fileSet></fileSets><!-- 定义依赖项集,指定要包含的依赖项及其在包中的目标路径 --><dependencySets><dependencySet><!-- 依赖项在生成的包中的输出路径 --><outputDirectory>/lib</outputDirectory><!-- 是否解压依赖项 --><unpack>false</unpack><!-- 包含的依赖项的范围,例如 runtime、compile、test 等 --><scope>runtime</scope></dependencySet></dependencySets><!-- 定义单个文件,指定要包含的文件和目标路径 --><files><file><!-- 要打包的单个文件 --><source>README.md</source><!-- 在生成的包中的输出路径 --><outputDirectory>/</outputDirectory></file></files>
</assembly>

根据上面的逻辑,我们可以得到哪些文件会被打包,另外由于我们重写了repackage插件,我们就可以自由的控制打包的jar包的内容

这篇关于maven 以及插件重写的一些思考的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125416

相关文章

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚