(尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/83795622冷血之心的博客)

关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~

快速导航:

Maven基础概念和安装配置教程

Maven的仓库和settings.xml配置文件

Maven的坐标与依赖

Maven的生命周期和插件

Maven的聚合与继承

目录

Maven的生命周期

生命周期的定义

clean生命周期

default生命周期

site生命周期

Maven的插件

插件的目标

插件的绑定

内置绑定

自定义绑定

插件的配置

总结


在上边的学习中,我们介绍了Maven是一种强大的构建工具,能够帮助我们自动下载构件,并且通过给每一个构件确定其坐标,实现了构件在仓库中的存储。在这篇文章中,我们主要介绍Maven的生命周期和其插件的使用。

Maven的生命周期

生命周期的定义

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

Maven提供了三套独立的生命周期:clean, default 和 site ,接下来我们分别介绍三套生命周期:

clean生命周期

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

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

举例:

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

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阶段,实际执行了validatetest阶段之间的所有阶段

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

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

site生命周期

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

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

提问:

mvn clean deploy site-deploy命令所执行的生命周期的阶段都有哪些呢?(对于聪明的你来说一定没什么难度^_^)

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

Maven的插件

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

插件的目标

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

举例:

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

dependency : analyze     dependency : tree      denpendency : list

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

插件的绑定

插件的绑定分为内置绑定和自定义绑定,以下分别介绍。

内置绑定

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

为了能够让用户更加方便的构建项目,maven将大多数主要的生命周期阶段都绑定了很多插件的目标。如下所示:

我们在一个项目中执行mvn clean package来观察下会执行哪些生命周期的阶段,哪些插件目标会被执行。结果如下:

[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ passport-core ---
[INFO] Deleting D:\MiWork\passport\server\passport\passport-java-core\target
[INFO]
[INFO] --- build-helper-maven-plugin:1.9.1:add-source (add-source) @ passport-core ---
[INFO] Source directory: D:\MiWork\passport\server\passport\passport-java-core\src\thrift\gen-java added.
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ passport-core ---
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 2 resources
[INFO] Copying 8 resources
[INFO] Copying 317 resources
[INFO]
[INFO] --- maven-compiler-plugin:2.4:compile (default-compile) @ passport-core ---
[INFO] Compiling 317 source files to D:\MiWork\passport\server\passport\passport-java-core\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ passport-core ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:2.4:testCompile (default-testCompile) @ passport-core ---
[INFO] Compiling 35 source files to D:\MiWork\passport\server\passport\passport-java-core\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ passport-core ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ passport-core ---
[INFO] Building jar: D:\MiWork\passport\server\passport\passport-java-core\target\passport-core-0.0.26-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30.304 s
[INFO] Finished at: 2018-11-07T21:30:33+08:00
[INFO] Final Memory: 25M/267M

上边结果中我加粗的地方就是执行的插件,比如maven-clean-plugin:2.5:clean 的含义是说执行了2.5版本的maven-clean-plugin插件的 clean 的目标。

注意:

前边我们说了mvn clean package 就是在调用clean生命周期的clean阶段和default生命周期的package阶段,,实际执行了pre-cleanclean阶段和default生命周期validatepackage阶段之间的所有阶段。但是有一些生命周期阶段是没有绑定插件的,所以插件被执行的个数当然会小于validate到package的阶段的个数。

自定义绑定

前面说了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>

该段配置可以帮助我们构建项目的源码jar包,我们在命令行中执行mvn verify,会执行validate一直到verify阶段的所有阶段,结果如下:

[INFO] ------------------------------------------------------------------------
[INFO] Building passport-core 0.0.26-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- build-helper-maven-plugin:1.9.1:add-source (add-source) @ passport-core ---
[INFO] Source directory: D:\MiWork\passport\server\passport\passport-java-core\src\thrift\gen-java added.
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ passport-core ---
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 2 resources
[INFO] Copying 8 resources
[INFO] Copying 317 resources
[INFO]
[INFO] --- maven-compiler-plugin:2.4:compile (default-compile) @ passport-core ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ passport-core ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:2.4:testCompile (default-testCompile) @ passport-core ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ passport-core ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ passport-core ---
[INFO] Building jar: D:\MiWork\passport\server\passport\passport-java-core\target\passport-core-0.0.26-SNAPSHOT.jar
[INFO]
[INFO] --- maven-source-plugin:3.0.1:jar-no-fork (attach-sources) @ passport-core ---
[INFO] Building jar: D:\MiWork\passport\server\passport\passport-java-core\target\passport-core-0.0.26-SNAPSHOT-sources.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.648 s
[INFO] Finished at: 2018-11-07T21:58:44+08:00
[INFO] Final Memory: 25M/357M
         可以看到我们刚刚自定义的绑定插件maven-source-plugin的目标jar-no-fork被执行,并且在项目的构建输出的/target/下出现了-source包。

插件的配置

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

    <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兼容的字节码文件。

我们还可以在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>

我们来翻译以下这段配置,那就是:

将插件maven-source-plugin的目标jar-no-fork绑定到生命周期的verify阶段,并且该任务的id为attach-sources.

从构建的输出日志中我们也可以看出来,如下所示:

总结

这节内容比较重要,阐述了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 :资源文件处理

如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~

本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。

关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~

Maven的生命周期和插件相关推荐

  1. Maven入门指南⑦:Maven的生命周期和插件

    Maven入门指南⑦:Maven的生命周期和插件 一个完整的项目构建过程通常包括清理.编译.测试.打包.集成测试.验证.部署等步骤,Maven从中抽取了一套完善的.易扩展的生命周期.Maven的生命周 ...

  2. maven(7)生命周期和插件

    [0]README 1)本文部分文字转自 "maven实战",旨在 review  "maven(7)生命周期和插件" 的相关知识: 2)maven 另外两个核 ...

  3. Maven之生命周期和插件

    Maven之坐标和依赖_jerry_dyy的博客-CSDN博客 Maven之仓库_jerry_dyy的博客-CSDN博客 Maven之聚合与继承_jerry_dyy的博客-CSDN博客 Maven之生 ...

  4. Maven的生命周期与插件

    项目构建生命周期 Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM).Maven构建生命周期描述的是一次构建过程经历经历了多少个事件.对项目构建的生命周期划分为3 ...

  5. maven详解之生命周期与插件

    Maven是一个优秀的项目管理工具,它能够帮你管理编译.报告.文档等. Maven的生命周期: maven的生命周期是抽象的,它本身并不做任何的工作.实际的工作都交由"插件"来完成 ...

  6. maven的仓库、生命周期与插件

    一.仓库 统一存储所有Maven项目共享的构建的位置就是仓库. 仓库分为本地仓库和远程仓库.远程仓库又分为中央仓库(中央仓库是Maven核心自带的远程仓库),伺服(另一种特殊的远程仓库,为节省宽带和时 ...

  7. Maven生命周期和插件的那些事(2021版)

    前言:在日常开发中我们经常使用IDE提供的MAVEN功能,如下图所示,通过右键->run maven build的方式或者通过命令行运行maven命令的方式来对项目进行构建.在我们通过简单操作就 ...

  8. Maven学习总结(16)——深入理解maven生命周期和插件

    在项目里用了快一年的maven了,最近突然发现maven项目在eclipse中build时非常慢,因为经常用clean install命令来build项目,也没有管那么多,但最近实在受不了乌龟一样的b ...

  9. Maven的生命周期和maven-assembly-plugin插件使用

    2019独角兽企业重金招聘Python工程师标准>>> 记住,运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译, ...

最新文章

  1. php mysql 连接不上_PHP: 连接状态 - Manual
  2. 封装运动框架多个属性
  3. Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找
  4. 前端开发笔记(2)css基础(上)
  5. 使用Api分析器与Windows兼容包来编写智能的跨平台.NET Core应用
  6. 统计学习方法 pdf_机器学习基础教材-《统计学习与数据分析介绍》免费pdf分享...
  7. 解决克隆clone github 仓库速度过慢的问题
  8. 安卓system镜像分区_玩机爱好者想要的PT分区到底是什么?可以使现有的安卓系统更快!...
  9. 统计学基础学习笔记:概率与概率分布
  10. django模型_Django模型
  11. 如何知道PostgreSQL数据库下每个数据库所对应的目录
  12. 【网络流24题】分配问题 最小最大费用最大流
  13. 《JDBC与Java数据库编程》pdf 附下载链接
  14. dos命令怎样进入计算机,怎么进DOS命令的方法
  15. php 微信机器人_php7 版本的微信机器人来了!(这应该是最灵活的版本了)
  16. ASR中常用的语音特征之FBank和MFCC
  17. 如何删除tmp计算机桌面,教你Win10系统中tmp文件删除不了应该如何解决?
  18. java抢红包_Java实现抢红包功能
  19. yii2 使用redis
  20. [解题报告]11689 - Soda Surpler

热门文章

  1. win10如何获得管理员权限
  2. 手机wps怎么设置打印横竖_手机WPS怎么设置横版打印?
  3. 容联与腾讯云牵手!这一合作背后有何深意?
  4. 迪士尼超级计算机多少钱,上海迪士尼乐园公布票务调整方案,明年1月9日起实行新票价...
  5. cornell grasp data 康奈尔大学抓取数据集 百度云
  6. ubuntu18 编译maplab opencv3_catkin 时出现Flow control statements are not properly nested.
  7. chage(charger)
  8. OpenCV实战(4)——像素操作
  9. 蜗牛星际b款装服务器系统,蜗牛星际 B款 双网口 全新安装黑群晖
  10. org.springframework.dao.InvalidDataAccessApiUsageException:The given object has a null identifi的解决方案