Maven 生命周期
1 简介
在Maven中一共有如下的核心概念
在接下来的一系列文章中,生命周期和插件是要阐述的目标。Maven生命周期和插件有怎样的关系?Maven有哪些生命周期,一个人的生命周期有婴儿、少年你、青年、壮年、老年等阶段,在Maven中生命周期分为那些阶段?Maven提炼出这些生命周期阶段有着怎样的好处呢?
Maven的生命周期就是为了对所有的构建过程进行抽象和统一Maven从大量项目和构建过程中学习和反思,然后总结了一套高度完善的易于扩展的生命周期。这个生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。
2 AstractBuild
public abstract class AbstractBuild(){
public void build(){
initialize(); // 初始化工作
compile(); // 编译
test(); // 测试
packagee(); // 打包
integrationTest(); // 集成测试
deploy(); // 部署
}
}
如上述简单抽象类而言,在Maven设计中,实际的任务都交由插件来完成。这种思想与设计模式中的模板方法模式Template Method类似,由Maven规定了构建的整体过程,而子类可以通过实现或者重写父类的方法来控制实际的行为,即保持扩展性,又严格的控制整体结构。
在实际执行类似mvn clean或者mvn compile的命令时,实际上均调用了相应的插件来执行相应的功能。可以理解为插件实现了生命周期中各个阶段的对应抽象方法。生命周期抽象了构建的各个步骤,定义了它们的次序,但没有给出具体的实现。当然不能让用户为了编译而写出一堆代码,因为这样成千上万的用户均可能给出个性化的实现,这样显然增加了实际构建的复杂性,Maven设计了插件机制。每个构建步骤都可以绑定一个或者多个插件行为(插件目标Plugin Goal),虽然Maven提供了许多的插件,但为了个性化用户需求,Maven开放了插件配置的能力,可以自定义插件执行任务时的配置。
Maven的生命周期和插件机制一方面保证了所有的Maven项目有一致的构建标准,另一方面通过默认插件简化和稳定了实际项目的构建。此外,该机制提供了足够的扩展空间,用户可以通过配置现有插件或者自行编写插件来自定义构建行为。
3 三套生命周期
3.1 三套生命周期
Maven 有三套相互独立的生命周期,分别是clean、default和site。
- clean生命周期的目的是清理项目
- default生命周期的目的是构建项目
- site生命周期的目的是建立项目站点
需要注意的是:这些阶段是有顺序的,用户和Maven最直接的交互方式就是调用这些生命周期阶段。并且三套生命周期是相互独立的。
3.2 命令行与生命周期
3.2.1 mvn clean
可以看到在实际执行时调用了插件maven-clean-plugin:3.0.0的clean目标。执行了default-clean生命周期
3.2.2 mvn test
mvn test该命令调用了default生命周期的test阶段,实际调用了validate、initialize直到test的所有阶段。
3.2.3 mvn clean install
D:\Git\profile\profile>mvn clean install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------< com.example:profile >-------------------------
[INFO] Building profile 1.3-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.0.0:clean (default-clean) @ profile ---
[INFO] Deleting D:\Git\profile\profile\target
[INFO]
[INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ profile ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 4 resources
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ profile ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 3 source files to D:\Git\profile\profile\target\classes
[INFO]
[INFO] --- maven-resources-plugin:3.0.1:testResources (default-testResources) @ profile ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\Git\profile\profile\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ profile ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.21.0:test (default-test) @ profile ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ profile ---
[INFO] Building jar: D:\Git\profile\profile\target\profile-1.3-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ profile ---
[INFO] Installing D:\Git\profile\profile\target\profile-1.3-SNAPSHOT.jar to C:\Users\lenovo\.m2\repository\com\example\p
rofile\1.3-SNAPSHOT\profile-1.3-SNAPSHOT.jar
[INFO] Installing D:\Git\profile\profile\pom.xml to C:\Users\lenovo\.m2\repository\com\example\profile\1.3-SNAPSHOT\prof
ile-1.3-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.588 s
[INFO] Finished at: 2019-06-22T11:38:05+08:00
[INFO] ------------------------------------------------------------------------
D:\Git\profile\profile>
该命令执行了clean生命周期的clean阶段和default生命周期的install阶段。
4 总结
文档简要陈述了Maven生命周期的基本概念,通过抽象类AbstractBuild理解模板方法在Maven生命周期的使用。最后讲述了三套Maven生命周期的基本含义和阶段,只要对Maven生命周期有一个基本的理解,读者就可以正确而熟练的使用Maven命令。
2019年6月22日11:42:08于马塍路36号