maven生命周期lifecycle和plugins介绍

article/2025/9/14 5:38:43

一、Maven的生命周期

生命周期的定义:Maven的生命周期就是为了对所有的构建过程进行抽象和统一。在大量项目的构建过程中,Maven总结出了一套高度完善的,易于扩展的生命周期,包括项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和生成站点等构建步骤。在我们日常的maven使用中,一条条简单的命令,mvn clean, mvn package等都是在执行Maven的某个生命周期阶段。Maven提供了三套独立的生命周期:clean, default 和 site ,接下来我们分别介绍三套生命周期:

在这里插入图片描述

  1. clean生命周期

clean生命周期的目的是清理项目,删除前一次构建在target文件夹下生成的各个Jar包等,它包含以下三个阶段:

  • pre-clean:执行一些清理前需要完成的工作
  • clean:清理上一次构建生成的文件
  • post-clean:执行一些清理后需要完成的工作

举例:

我们在命令行中输入: mvn clean 就是在调用clean生命周期的clean阶段,实际执行了pre-clean和clean阶段

  1. 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-classed
test:使用单元测试框架运行测试,测试代码不会被打包或部署
prepare-package
package:接受编译好的代码,打包成可发布的格式,jar/war等
pre-integration-test
integration-test
post-integration-test
verify
install
deploy

  • 此处我们注意下 install 生命周期阶段,若我们在当前的maven项目中执行 mvn install ,那么将执行validate到 install 的所有生命周期阶段,结果就是将我们当前的项目打包并且安装在了本地仓库。但是install插件还有一个目标 install-file 该插件目标可以将我们普通Java项目到处的jar包安装到本地仓库。举例如下:
mvn install:install-file -Dfile=testJar.jar -DgroupId=com.jar -DartifactId=mainywq -Dversion=1.0-SNAPSHOT -Dpackaging=jar  
  • mvn test 就是在调用default生命周期的test阶段,实际执行了validate到test阶段之间的所有阶段

  • mvn clean package 就是在调用clean生命周期的clean阶段和default生命周期的package阶段,实际执行了pre-clean和clean阶段和default生命周期validate到package阶段之间的所有阶段

  • mvn clean install 和 mvn clean deploy 所调用的生命周期阶段请各位自行分析(对于聪明的你来说一定没什么难度)

  1. site生命周期

site生命周期的目的是建立和发布项目站点,Maven可以给予pom所包含的信息,生成一个站点,方便团队交流和发布项目信息,其生命周期阶段包含:

  • pre- site
  • site:生成项目站点文档
  • post-site
  • site-deploy:将生成的项目站点发布到服务器上

二、plugins

好的,介绍了三套Maven生命周期之后,我们会有一个疑问:生命周期是抽象的,那么实际的任务如package,install等阶段的任务都是怎么实现的呢?答案就是我们接下来要介绍的主角:插件(plugin)

  1. Maven的插件

生命周期的各个阶段都是抽象的概念,真正干活的是一个个的插件,插件是以独立的构件形式存在,我们将maven的生命周期的各个阶段与maven的插件进行绑定,当我们执行mvn命令其实就是在指挥着一个个的插件在干活。

  1. 插件的目标

maven的插件以独立的构件形式存在,为了能够复用代码,使得一个插件可以完成多个任务,我们定义了插件目标(Plugin Goal),每一个目标都可以完成不同的功能。

  • maven-dependency-plugin插件具有多个功能,比如分析项目依赖,还能列出项目的依赖树等。就是使用了analyze, tree和list等插件目标区分的。
  • dependency : analyze
  • dependency : tree
  • denpendency : list

以上冒号左边的表示插件前缀dependency,冒号右边的表示插件的目标Goal

  1. 插件的绑定:插件的绑定分为内置绑定和自定义绑定,以下分别介绍。
  • 3.1内置绑定

maven的生命周期的各个阶段与maven插件互相绑定,从而完成具体的构件任务。default生命周期的compile阶段与maven-compiler-plugin插件的目标compile进行绑定的示意图如下所示:
在这里插入图片描述

为了能够让用户更加方便的构建项目,maven将大多数主要的生命周期阶段都绑定了很多插件的目标。如下所示:
在这里插入图片描述
在这里插入图片描述
执行例子(以maven clean install为例)
在这里插入图片描述在这里插入图片描述

由上图可知,各个插件的执行顺序一般是:1:clean、2:resources、3:compile、4:testResources、5:testCompile、6:test、7:jar、8:install。在图中标记的地方每一行都是由冒号分隔的,前半部分是对应的插件,后半部分是插件的执行目标也就是插件执行产生的结果。现在我们来看下上面的pom文件,我们如配置了maven-compiler-plugin这个插件,其它的插件没有配置,但最后项目构建成功,说明maven内置的各种插件,如果pom中没有配置就调用默认的内置插件,如果pom中配置了就调用配置的插件。到此我们理解maven的构建过程或者有更多的人称是打包,就是由各种插件按照一定的顺序执行来完成项目的编译,单元测试、打包、布署的完成。各种插件的执行过程也就构成的maven的生命周期(lifecycle)。生命周期(lifecycle)各个阶段并非不能独立的,可以单独执行如mvn clean,也可以一起执行如mvn clean install。而且有的mvn命令其是包括多个阶段的,如mvn compile其是包括了resources和compile两个阶段。下面分别来分析各个阶段需要的插件和输出的结果

  • clean插件maven-clean-plugin

clean阶段是独立的一个阶段,功能就是清除工程目前下的target目录,对应的插件是 maven-clean-plugin,可以使用maven内置的插件,当然也可以自己在pom中配置。下面看下mvn执行前后工程目录下的输出对比
在这里插入图片描述
在这里插入图片描述

  • resources插件maven-resources-plugin

resource插件的功能就是把项目需要的配置文件拷贝到指定的目录,默认是拷贝src\main\resources目录下的文件到classes目录下,当然可以自己来配置源目录和输出目录。resources插件一般不单独执行,complie插件执行时会先调用resources插件。配置示例如下:

       <plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-resources-plugin</artifactId>  <version>x.x</version>  <executions>  <execution>  <id>copy-resources</id>  <!-- 在default生命周期的 validate阶段就执行resources插件的copy-resources目标 -->  <phase>validate</phase>  <goals>  <goal>copy-resources</goal>  </goals>  <configuration>  <!-- 指定resources插件处理资源文件到哪个目录下 -->  <outputDirectory>${project.build.outputDirectory}</outputDirectory>  <!-- 也可以用下面这样的方式(指定相对url的方式指定outputDirectory) <outputDirectory>target/classes</outputDirectory> -->  <!-- 待处理的资源定义 -->  <resources>  <resource>  <!-- 指定resources插件处理哪个目录下的资源文件 -->  <directory>src/main/${deploy.env}/applicationContext.xml</directory>  <!-- 指定不需要处理的资源 <excludes> <exclude>WEB-INF/*.*</exclude> </excludes> -->  <!-- 是否对待处理的资源开启过滤模式 (resources插件的copy-resources目标也有资源过滤的功能,这里配置的   这个功能的效果跟<build><resources><resource>下配置的资源过滤是一样的,只不过可能执行的阶段不一样, 这里执行的阶段是插件指定的validate阶段,<build><resources><resource>下的配置将是在resources插件的resources目标执行时起作用(在process-resources阶段)) -->  <filtering>false</filtering>  </resource>  </resources>  </configuration>  <inherited></inherited>  </execution>  </executions>  </plugin>  
  • compile插件maven-compiler-plugin

compile插件执行时先调用resouces插件,功能就是把src\mainjava源码编译成字节码生成class文件,并把编译好的class文件输出到target\classes目录下。下面看执行结果:

在这里插入图片描述

  • 单元测试所用插件

单元测试所用的compile和resources插件和主代码是相同的,但执行的目标不同,目标testCompile和testResources是把src\test\java下的代码编译成字节码输出到target\test-classes,同时把src\test\resources下的配置文件拷贝到target\test-classes。看下面的输出:

在这里插入图片描述

  • 插件maven-surefire-plugin执行单元测试类的

在本例中就是运行contextLoads()方法,如果单元测试不通行,构建会失败,在编译正式的项目时可以使用mvn -Dmaven.test.skip=true 来跳过测试类的编译和运行过程mvn test可以单独执行,但是这个命令其实是包括了resources、compile、testResources、testCompile、test这几个阶段,如下图所示:
在这里插入图片描述

  • 打包插件

这个插件是把class文件、配置文件打成一个jar(war或其它格式)包。依赖包是不在jar里面的,需要建立lib目录,且jar和lib目录在同级目录。常用的打包插件有maven-jar-plugin、maven-assembly-plugin、maven-shade-plugin三种,下面分别介绍下各自己pom配置和使用特点。

- maven-jar-plugin

可执行jar与依赖包是分开,需建立lib目录里来存放需要的j依赖包,且需要jar和lib目录在同级目录

             <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.6</version><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix><mainClass>com.xxx.xxxService</mainClass></manifest></archive></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>x.x</version><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin>

- maven-assembly-plugin

这个插件可以把所有的依赖包打入到可执行jar包。但是该插件有个bug会缺失spring的xds文件,导致无法运行jar,同时如果同级目录还有其它可执行jar文件依赖可能会产生冲突。

             <plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><mainClass>com.xxx.xxxService</mainClass></manifest></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin>

- maven-shade-plugin

所有的依赖包打入到可执行jar包,如果同级目录有其它可执行jar,依赖可能会产生冲突,且运行jar时,有时会出现SF、DSA、RSA文件冲突的提示,需要排除META-INF目录下的文件。

    <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>x.x.x</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.schemas</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.tooling</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.xxx.xxxInvoke</mainClass></transformer></transformers><minimizeJar>true</minimizeJar><shadedArtifactAttached>true</shadedArtifactAttached></configuration></execution></executions></plugin>
  • 发布插件maven-install-plugin

发布插件的功能就是把构建好的artifact部署到本地仓库,还有一个deploy插件是将构建好的artifact部署到远程仓库。

  • 3.2 自定义绑定
    前面说了maven的内置绑定,当然maven为了满足用户多元化的构建过程,是允许我们自定义的选择将某个插件绑定到生命周期的某个阶段的。接下来,我们将maven-source-plugin插件的jar-no-fork任务绑定到verify生命周期阶段,我们只需要在pom中增加如下的配置即可:
<build><plugins><plugin><artifactId>maven-source-plugin</artifactId> // 插件<version>3.0.1</version><executions>                             // 可以配置执行的任务<execution><id>attach-sources</id>     // 任务id<phase>verify</phase>      // 生命周期verify阶段<goals><goal>jar-no-fork</goal> // 插件目标</goals></execution></executions></plugin></plugins>
</build>

执行:mvn verify
在这里插入图片描述可以看到我们刚刚自定义的绑定插件maven-source-plugin的目标jar-no-fork被执行,并且在项目的构建输出的/target/下出现了-source包。
在这里插入图片描述

三、插件的配置

在项目的配置文件pom中,我们可以对插件进行一个全局的配置,,我们可以在中配置来搞定,举例如下:

    <plugins> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.4</version><configuration><source>1.6</source><target>1.6</target><fork>true</fork><verbose>true</verbose><encoding>UTF-8</encoding><compilerArguments><sourcepath>${project.basedir}/src/main/java</sourcepath></compilerArguments><compilerArgument>-XDignore.symbol.file</compilerArgument></configuration></plugin></plugins> 

该配置表示我们要编译Java1.6版本的源文件,生成与JVM1.6兼容的字节码文件。

四、总结

本文阐述了maven中的两个重要概念生命周期和插件。正是生命周期阶段和插件的互相绑定,我们才能真正完成项目的构建。常用的插件如下:有需要深入了解的可以自行查阅相关资料。

  • maven-assembly-plugin :自定义打包方式,还是很有趣的,感兴趣的可以研究哦

  • maven-enforcer-plugin :展示项目依赖冲突

  • maven-antrun-plugin :运行ant脚本

  • maven-dependency-plugin :分析项目依赖

  • maven-clean-plugin :清理

  • maven-compiler-plugin :编译

  • maven-source-plugin :源码

  • maven-war-plugin :打包

  • maven-jar-plugin:打包

  • maven-surefire-plugin :测试

  • maven-resources-plugin :资源文件处理

文章转自
文章转自


http://chatgpt.dhexx.cn/article/4spf6J6b.shtml

相关文章

【Maven】IDEA中Maven生命周期

Maven生命周期&#xff08;lifecycle&#xff09;由各个阶段组成&#xff0c;每个阶段由Maven的插件plugin来执行完成。 生命周期&#xff08;lifecycle&#xff09;主要包括clean、resources、complie、install、pacakge、testResources、testCompile、deploy等&#xff0c;其…

Maven生命周期与插件

竟无语凝噎 文章目录 前言一、生命周期二、插件总结 前言 maven原来有这么多道道 一、生命周期 Maven对项目构建的生命周期划分为三套 clean&#xff1a;清理工作 default&#xff1a;核心工作&#xff0c;例如编译&#xff0c;测试&#xff0c;打包&#xff0c;部署等 si…

Maven 生命周期详解

思考&#xff1a;我们常使用的maven命令&#xff0c;比如 mvn clean install&#xff0c;mvn clean package 这些命令到底最后是如何工作的&#xff1f; 在这里我们还是先一步步来&#xff0c;其实它们运行的是生命周期中对应的phase阶段。 Maven 拥有三套独立的生命周期&…

关于maven生命周期的理解

晚上有点无聊&#xff0c;看到了一些东西引发了自己的思路&#xff0c;就想将maven的一些东西总结总结&#xff0c;有从网上抄的&#xff0c;也有自己的思路。 一、生命周期是指什么&#xff08;lifecycle&#xff09; Maven的生命周期就是对所有的构建过程进行抽象和统一。包…

Maven的生命周期

一、生命周期简介&#xff1a; Maven强大的一个重要的原因是它有一个十分完善的生命周期模型&#xff0c;这个生命周期可以从两方面来理解&#xff1a; 运行Maven的每个步骤都由它来定义的&#xff0c;这种预定义的默认行为使得我们使用Maven变得简单。 这个模型是一种标准&am…

Maven 生命周期

1. Maven 构建生命周期 Maven 构建生命周期就是 Maven 将一个整体任务划分为一个个的阶段&#xff0c;类似于流程图&#xff0c;按顺序依次执行。也可以指定该任务执行到中间的某个阶段结束。Maven 的内部有三个构建生命周期&#xff0c;分别是 clean, default, site。其中 def…

Maven生命周期

Maven生命周期 个人网站 https://blog.deschen.cn/ 文章目录 Maven生命周期一、Maven生命周期的定义二、Maven三套独立的生命周期三、Maven的插件 一、Maven生命周期的定义 Maven的生命周期就是为了对所有的构建过程进行抽象和统一。包括项目的清理&#xff0c;初始化&#x…

Maven —— 生命周期

每个生命周期的各个环节都是由各种插件完成&#xff01;&#xff01;&#xff01;Maven有三个相互独立的生命周期&#xff08;Maven的这三个生命周期不能看成一个整体&#xff09;&#xff01;&#xff01;&#xff01; mvn clean&#xff1a;清理编译的项目mvn compile&#x…

代码统计利器--CLOC

MAC下安装命令:$ brew install cloc其他的linux安装 $ aptitude install cloc使用方法.到目录下运行: $ cloc .The default output will show you a breakdown by language. Here’s an example of what it’ll look like: php much? You can, of course, customize the poop …

代码统计工具cloc使用

简介 CLOC(Count Lines of Code)&#xff0c;是一个可以统计多种编程语言中空行、评论行和物理行的工具。这个工具还是蛮实用的&#xff0c;可以帮我们快速了解一个项目中代码的信息。 安装使用 windows 10 win10下可以去github上下载其最新版&#xff0c;截止本文时&#…

windows代码量计算开源工具cloc安装和使用教程

windows代码量计算开源工具cloc 下载cloc使用cloc 下载cloc cloc下载地址: https://github.com/AlDanial/cloc/releases. 选择exe版本的&#xff0c;也可以下载我上传的1.90版本链接: 点击跳转下载地址 使用cloc 下载好cloc-1.90.exe之后&#xff0c;重命名未cloc.exe&…

Linux统计代码量命令cloc

记录一下Linux中一个非常好用的代码量统计命令&#xff1a;cloc 安装步骤&#xff1a; sudo apt-get install cloc使用方法&#xff1a; 进入到要统计的工程根目录&#xff1a; cloc .运行结果:

Windows环境下用cloc统计代码量

cloc一款开源代码统计工具&#xff0c;支持windows和Linux环境。能统计指定文件夹或文件夹中文件数files、空白行数blank、注释行数comment和代码行数code。今天介绍windows环境下的使用方法。 使用简单&#xff1a; 下载&#xff1a; Releases AlDanial/cloc (github.com)…

代码统计工具CLOC的使用

简介 CLOC(Count Lines of Code)&#xff0c;是一个可以统计多种编程语言中空行、评论行和物理行的工具。这个工具还是蛮实用的&#xff0c;可以帮我们快速了解一个项目中代码的信息。 安装使用 windows 10 win10下可以去github上下载其最新版&#xff0c;截止本文时&#…

cloc 代码统计工具

安装 yum -y install cloc使用 [rootnode1 new-website]# cloc .135 text files.134 unique files.20 files ignored.github.com/AlDanial/cloc v 1.70 T3.63 s (32.0 files/s, 26416.0 lines/s) ------------------------------------------------------------------------…

10分钟掌握高效代码行统计工具——cloc

cloc 一款高效的代码行统计工具&#xff0c;且跨多平台&#xff1a; WindowLinuxMac… … 高效是其优点&#xff0c;且稳定性比较好。 Linux版的可以处理超大工程的文件&#xff0c;不会出现其它同类工具在处理超大文件时崩溃的问题。 用法简单&#xff0c;学习成本低&…

前端代码统计工具cloc的安装与使用

怎么来衡量一个web端项目的大小&#xff0c;一是看页面多少&#xff0c;二是看源代码行数。页面多少比较好统计&#xff0c;通过 Router 的配置大概就能知道。但是源代码行数&#xff0c;如果要一个文件一个文件去计算&#xff0c;那就费了劲了。有问题有需求&#xff0c;就会有…

“无法启动mysql服务,错误1053”解决办法

启动MySQL服务时&#xff0c;报错如下&#xff1a; 1.“CTRLR”打开运行窗口&#xff0c;输入regedit点击确定打开注册表编辑器 2.找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL目录 3.修改ImagePath路径为mysqlld.exe路径&#xff0c;重启服务即可

解决Windows服务1053错误方法

WCF使用MSMQ绑定寄宿在Windows服务上&#xff0c;但启动服务时出现1053错误 在网上搜索了N多解决方案&#xff0c;都是比较高深的扯到原理和系统bug等问题 看了看到最后也没有解决&#xff0c;最终我决定使用一个比较山寨的但很有用的方式查看问题所在&#xff0c;所以就在代码…

windows无法启动MySQL服务出现1053错误原因之一

今天去使用mysql的时候出现了这样一个问题 我以为是mysql服务没开&#xff0c;去开启服务的时候出现 错误原因 服务的路径与安装的路径不一致&#xff0c;之前安装过mysql后卸载重装容易出现这样的问题&#xff0c;要么就是你可能从计算机上面卸载什么&#xff0c;组件程序&a…