Maven 执行原理:生命周期、插件(及自定义插件示例)

maven的理想:像一种什么设计模式?—模板方法模式

  • 自动走完标准的构建流程:清理 --> 编译 --> 測试 --> 报告 --> 打包 --> 部署
  • 统一入口,所有配置在一个pom里搞定

1.maven生命周期、阶段

maven有三个完全独立的生命周期(LifeCycle):Clean,Build,Site。每个生命周期都由一系列阶段(Phase)组成,执行其中某个阶段时,必须将当前周期的所有阶段执行完。LifeCycle和Phase具体的对应关系如下图:

在这里插入图片描述

各个生命周期的阶段(phase)定义如下:

阶段处理描述
验证 validate验证项目验证项目是否正确且所有必须信息是可用的
编译 compile执行编译源代码编译在此阶段完成
测试 Test测试使用适当的单元测试框架(例如JUnit)运行测试。
包装 package打包创建JAR/WAR包如在 pom.xml 中定义提及的包
检查 verify检查对集成测试的结果进行检查,以保证质量达标
安装 install安装安装打包的项目到本地仓库,以供其他项目使用
部署 deploy部署拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

运行任何一个阶段,都会从其所在生命周期的第一个阶段开始,顺序执行到指定的阶段。比如,mvn package — 本义:执行default周期的package阶段,maven会自动从process-resources阶段开始运行到package阶段结束

maven的构建生命周期,只是一个抽象规范流程。周期内的每个阶段的执行,是交由plugin插件来完成

2.maven插件

插件plugin是绑定到生命周期,承担实际功能的组件。mvn运行时,自动关联插件来运行。下表是maven默认的各阶段对应的插件列表:

生命周期生命周期阶段插件目标执行任务
cleanpre-clean
cleanmaven-clean-plugin:clean删除项目的输出目录
post-clean
sitepre-site
sitemaven-site-plugin:site
post-site
site-deploymaven-site-plugin:deploy
defaultprocess-resourcesmaven-resources-plugin:resources复制主资源文件至主输出目录
compilemaven-compiler-plugin:compile编译主代码至主输出目录
process-test-resourcesmaven-resources-plugin:testResources复制测试资源文件至测试输出目
test-compilemaven-compiler-plugin:testCompile编译测试代码至测试输出目录
testmaven-surefire-plugin:test执行测试用例
packagemaven-jar-plugin:jar(ejb:ejb jar:jar rar:rar war:war)创建项目jar包
installmaven-install-plugin:install将项目输出构件安装到本地仓库
deploymaven-deploy-plugin:deploy将项目输出构件部署到远程仓库

另外,maven还可以自定义插件,来扩展maven的功能。

问题一:这些插件在哪里设置?

关于插件的配置一般是在pom文件的<plgin>标签中,具体关系是:<bulid>:<pluginManagement>:<plugins>:<plugin>。下图是关于maven默认插件和自定义插件的配置示例:

在这里插入图片描述
可以看到,默认插件是maven开头,没有execution这一项,不需要再手动绑定声明周期阶段。

问题二:如何执行maven中的这些插件?

命令格式一:mvn 插件name goal。比如:

  • mvn jetty:run
  • mvn com.xupt.yzh:my_maven_plugin:1.0-SNAPSHOT:log(下面的自定义插件示例)
  • 在执行命令时还可以传入参数,mvn com.xupt.yzh:my_maven_plugin:1.0-SNAPSHOT:log -D log.name=Lisi

1.LifeCycle、Phase、Plugin、Goal关系?

  • 一个LifeCycle包含多个Phase ,一个Phase绑定一个plugin ,一个 plugin 提供了一组可以被运行的 goal
  • 另外,从下面自定义插件就能看出,一个plugin是一个项目,而goal对应一个具体的实现类(运行实例)


2.Phase和Goal什么关系?
一个Phase包含多个goal,但区别在于执行 Phase 时必须把周期内的前置阶段也执行完,而插件可以单独执行某个或一组 goal。

命令格式二:mvn 生命周期阶段。比如下面这些常用命令:

  • mvn clean:清理旧的jar包
  • mvn compile:编译主程序
  • mvn package:打包当前项目
  • mvn install:安装jar到本地库,等于package+放到本地仓库

idea和eclipse生成项目最终也是依赖maven插件生成的,它们一般自带了默认插件,所以我们在idea的右侧 maven#LifeCycle 直接运行即可。另外,我们自己引入的插件(比如jetty)也是在maven插件栏运行(maven#plugins)。

问题三:如何自定义插件?

插件的开发步骤如下:

1.引入maven api的依赖,设置打包方式为maven-plugin

在这里插入图片描述
2. 编写简单Mojo类—继承AbstractMojo,并指定goal,然后打包插件。

在这里插入图片描述
3. 通过命令执行插件 mvn [plugin-name] [goal-name],在这里是

在这里插入图片描述

这里再提一点,一个插件可以绑定多个周期。

问题四:自定义插件可以传入参数吗?

可以的,可以通过@Parameter定义参数,并指定默认值

在这里插入图片描述
执行结果如下:

在这里插入图片描述
现在我在执行命令时通过 -D 传入参数。mvn com.xupt.yzh:my_maven_plugin:1.0-SNAPSHOT:log -D log.name=Lisi,执行结果如下:
在这里插入图片描述
虽然我们可以自定义插件,但在实际开发中,使用默认插件就完全够用了,自定义插件很少用到。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值