IDEA 与 Maven 的那些事 0x04:IDEA 编辑器中 maven 的 Lifecycle 与 Plugins 的区别

12 篇文章 0 订阅
12 篇文章 0 订阅

参考:

  • https://blog.csdn.net/gao_zhennan/article/details/89713407
  • https://www.cnblogs.com/zhaiqianfeng/p/4620138.html


IDEA maven 的 Lifecycle 与 Plugins

IDEA 主界面右侧 Maven 标签栏有同样的命令,比如 install,既在 Plugins 中存在,也在 Lifecycle中存在。到底选哪个?二者又有什么区别呢?

经过实验,很多时候都是 Plugins中的命令报错,而 Lifecycle 中的命令正常执行。那么是不是说 Plugins 根本就没有必要存在?存在了还混淆视听?

要解答这个问题,首先要了解这两处的命令到底有什么差异。而之前,要先了解 Maven 的生命周期、阶段、插件和目标之间的关系。

生命周期(Lifecycle)

Maven 的生命周期就是对所有构建过程进行抽象和统一,包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成等几乎所有的构建步骤。

Maven 内置的三套生命周期:

  • Clean Lifecycle:做一些清理工作
    • pre-clean --> clean --> post-clean
  • Default LifeCycle:构建的核心部分、编译、测试、打包、部署等
    • validate --> compile --> test --> package --> integration-test --> verify --> install --> deploy
  • Site Lifecycle:生成项目报告、站点、发布站点
    • pre-site --> site --> post-site --> site-deploy

阶段(Phase)

每套生命周期都是一组阶段组成。

更多请参考官方文档:https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference

Clean Lifecycle
  1. pre-clean 执行一些需要在 clean 之前完成的工作
  2. clean 移除所有上一次构建所生成的文件
  3. post-clean 执行一些需要在 clean 之后立即完成的工作
Default Lifecycle
  1. validate 验证项目正确且所需信息都可获得
  2. initialize 初始化构建状态,如:设置属性值、创建目录
  3. generate-sources 生成编译过程中需要对导入进行操作的源码
  4. process-sources 处理源码,如:过滤值
  5. generate-resources 为包中的导入依赖生成资源
  6. process-resources 复制并处理资源文件至目标目录,准备打包
  7. compile 编译项目的源代码
  8. process-classes 处理并测试源码,如:过滤值
  9. generate-test-sources
  10. process-test-sources
  11. generate-test-resources
  12. process-test-resources 复制并处理资源文件,至目标测试目录
  13. test-compile 编译测试源码
  14. process-test-classes
  15. test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署
  16. prepare-package
  17. package 接收编译好的代码,打包成可发布的格式,如:jar
  18. pre-integration-test
  19. integration-test
  20. post-integration-test
  21. verify
  22. install
Site Lifecycle
  1. pre-site 执行一些需要在生成站点文档之前完成的工作
  2. site 生成项目的站点文档
  3. post-site 执行一些需要在生成站点文档之后完成的工作,并为部署做准备
  4. site-deploy 将生成的站点文档部署到特定的服务器上

特点:阶段在生命周期内具有顺序性,在执行生命周期中某个阶段时会先按顺序执行本生命周期当前阶段之前的所有阶段,再执行当前阶段。

例如,Clean Lifecycle有 3 个阶段,按顺序依次为:

  1. pre-clean
  2. clean
  3. post-clean

则若执行命令 mvn clean 实际按顺序执行了 Clean Lifecyclepre-cleanclean

  • 那么如果只想执行第 2 个阶段呢,那就执行命令 mvn clean:clean(这就是下面要提到的插件:目标的执行方式了)

插件(plugin)和目标(goal)

一个阶段由插件与目标组成。

  • 可以理解为:
    • 一个阶段:一个步骤
    • 插件:打成 jar 包的 java 程序
    • 目标:插件程序的一个执行参数

即向插件程序传入一个执行参数并执行一次该插件程序,就等于进行了一个步骤。

例子:

mvn compiler:compile

compiler 是插件,compile 是目标,compiler:compile是一个阶段。

插件:目标 表示一个特定任务,阶段是生命周期中的特定步骤。

有些阶段声明绑定的插件:目标(即通过执行相应的插件:目标来实现),有些阶段没有声明绑定的插件:目标,是通过其他方式来实现的。

生命周期及包含阶段,阶段声明绑定的插件:目标如下:

  1. Clean Lifecycle

    顺序阶段插件:目标
    1pre-clean
    2cleanclean:clean
    3post-clean
  2. Default Lifecycle

    顺序阶段插件:目标
    1validate
    2initialize
    3generate-sources
    4process-sources
    5generate-resources
    6process-resourcesresources:resources
    7compilecompiler:compile
    8process-classes
    9generate-test-sources
    10process-test-sources
    11generate-test-resources
    12process-test-resourcesresources:testResources
    13test-compilecompiler:testCompile
    14process-test-classes
    15testsurefire:test
    16prepare-package
    17package
    18pre-integration-test
    19integration-test
    20post-integration-test
    21verify
    22installinstall:install
    23deploydeploy:deploy
  3. Site Lifecycle

    顺序阶段插件:目标
    1pre-site
    2sitesite:site
    3post-site
    4site-deploysite:deploy

在 IDEA 中使用 Lifecycle 下的 install (等价于在命令行执行 mvn install),代表执行的是 生命周期 的一个阶段(会自动先执行之前的所有阶段)。

如上所示,install 阶段前有 21 个阶段,即 mvn install 会先执行前面的 21 个阶段,之后再执行 install 这个阶段。

而作为对比,IDEA 中使用 Plugin 下的 install(等价于在命令行执行 mvn install:install),代表执行的是 插件:目标,它单独执行,不会先去执行之前的 21 个阶段。

另外,由于 生命周期 可以和 插件:目标 一起执行,所以可以先执行 verify 生命周期(执行 1~21 阶段),再执行 install:install(第 22 阶段)。所以以下两种写法其实最终实现效果是等价的。

mvn install

mvn verify install:install
  • 11
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值