一、生命周期
整个build生命周期包含多个phrase
默认的生命周期由以下phrase组成(按执行先后数序排列):
validate:验证项目合法并具备了所有需要的信息
initialize:初始化操作(创建目录结构)
generate-sources:生成项目源代码
process-source:处理项目源代码
generate-resource:生成项目资源文件
process-resource:将资源文件拷贝到目标路径
compile:编译项目源代码
process-class:编译后处理
generate-test-source:生成测试代码
process-test-source:对测试代码进行处理
generate-test-resource:生成测试资源
process-test-resource:对测试资源进行处理
test-compile:编译测试代码
process-test-classes:处理编译后的测试代码
test:执行单元测试
prepare-package:打包之前的准比操作
package:执行打包操作
pre-integration-test:集成测试之前的准备操作(创建集成测试环境)
integration-test:执行集成测试
post-integration-test:集成测试之后的操作(删除测试环境)
verify:检查打包后的项目是否符合质量标准。
install:将打包好的项目安装到本地repository,供其他项目引用
deploy:将项目部署到远程的repository
二、Plugin插件
phrase并不是Maven最小的执行单元,一个phrase可能包含多个goal,每一个goal才是最小的操作集,在maven中,goal的实现是通过plugin来完成的,并且一个plugin可实现多个goal,pom配置中,可通过<plugin>标签,为phrase引入具体的goal
<plugin>
<groupId>com.mycompany.example</groupId>
<artifactId>display-maven-plugin</artifactId> <!--引入的plugin-->
<version>1.0</version>
<executions>
<execution>
<phase>process-test-resources</phase> <!--该plugin应用在哪个phrase上-->
<goals>
<goal>time</goal> <!--执行plugin的哪一个goal-->
</goals>
<configuration> <!--配置goal在执行中需要的参数-->
<models>
<model>src/main/mdo/maven.mdo</model>
</models>
<version>4.0.0</version>
</configuration>
</execution>
</executions>
</plugin>
三、profile管理
一个项目,如果需求的产出不同,那么可能需要多种不同的build方式,比如项目P有2个子模块moduleA和moduleB,如果客户A只需要moduleA模块,而客户B只需要moduleB模块。那么是否需要通过切换不同的pom.xml来满足不同客户的构建需求呢?当然不用,因为maven提供了profile的功能。
通过profile可以满足按需求定制构建内容的功能,每一个个性化的build封装成一个profile,通过相应的触发器触发来达到不同的构建效果。
pom中是通过<profile>标签来配置的,针对上述需求可做如下配置
<profiles>
<profile>
<id>customeA</id>
<activation><!--activation用来定义profile的触发方式-->
<property>
<name>custome</name><!--当存在系统变量custome并且值为A的时候触发profile-->
<value>A</value>
</property>
</activation>
<modules><!--主项目的module构建完成之后,会构建profile声明的module-->
<module>moduleA</module>
</modules>
</profile>
<profile>
<id>customeB</id>
<activation>
<property>
<name>custome</name>
<value>B</value>
</property>
</activation>
<modules>
<module>moduleB</module>
</modules>
</profile>
<profiles>
四、依赖管理
传统项目中,搭建开发环境比较头疼的是jar包资源的管理,jar包之间深层次的依赖关系,版本冲突等等常常为开发人员带来不便
mavne项目引入dependency机制,可通过pom管理系统依赖jar
maven管理jar包的特点:
1.子项目自动含有父项目的jar包
2.X项目引用Y项目,Y项目引用Z项目,则X项目自动引用Z项目
通过maven管理项目的上下级结构更便于模块化开发,让开发人员更直观的了解系统体系结构
pom中,dependency的定义主要通过dependency标签,另外还提供了dependencyManagement标签
熟悉java设计模式的人该知道,日常编程中我们经常要用到模版方法模式(抽象类中声明模版,子类继承模版元素)
同样,dependencyManagement相当于定义了一个依赖模版,声明了所依赖artifact的详细信息(version,scope,exclusion等),这样子项目在引用这些artifact时便可不用再次声明
父项目:
<project>
...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-a</artifactId><!--声明依赖artifact的详细信息:版本、范围和exclusion-->
<version>1.0</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<groupId>group-c</groupId>
<artifactId>excluded-artifact</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependencies>
...
</project>
子项目:
<project>
...
<dependencies>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-a</artifactId><!--子项目中无需在声明artifact具体的详细信息-->
</dependency>
</dependencies>
...
</project>
注意:通过<dependencyManagement>标签管理的artifact,如果没有子项目引用那么是不会加载到项目里的
五、其他
1.知识库管理
maven提供两种类型的repository,local和remote
成功安装maven后,local存在用户的home目录下,用来缓存远程repository下载下来的artifact
默认情况下maven所使用的远端repository地址为
http://repo.maven.apache.org/maven2/
在pom中,可通过配置<repository>标签来引入第三方的repository
通过apacheArchiva项目,开发人员还可构建自己的repository,项目地址
http://archiva.apache.org/index.cgi
2.常用命令参数
-P 选定profile
-pl 选定模块
-D 设置系统变量
3.Eclipse插件
http://maven.apache.org/eclipse-plugin.html