Maven的运行理念:
maven提供了一个平台,plugins能被这个平台所管理和利用,通过这些plugin根据平台所提供的项目信息来管理项目。(项目信息来源pom文件).
maven 默认情况对项目定义了3个项目管理周期
- default
- clean
- site
具体描述,大家可以在%M2_HOME%/lib/maven-2.0.9-uber.jar!/META-INF/plexus/components.xml
<lifecycle> <id>default</id> <phases> <phase>validate</phase> <phase>initialize</phase> <phase>generate-sources</phase> <phase>process-sources</phase> <phase>generate-resources</phase> <phase>process-resources</phase> <phase>compile</phase> <phase>process-classes</phase> <phase>generate-test-sources</phase> <phase>process-test-sources</phase> <phase>generate-test-resources</phase> <phase>process-test-resources</phase> <phase>test-compile</phase> <phase>process-test-classes</phase> <phase>test</phase> <phase>package</phase> <phase>pre-integration-test</phase> <phase>integration-test</phase> <phase>post-integration-test</phase> <phase>verify</phase> <phase>install</phase> <phase>deploy</phase> </phases> </lifecycle> <lifecycle> <id>clean</id> <phases> <phase>pre-clean</phase> <phase>clean</phase> <phase>post-clean</phase> </phases> <default-phases> <clean>org.apache.maven.plugins:maven-clean-plugin:clean</clean> </default-phases> </lifecycle> <lifecycle> <id>site</id> <phases> <phase>pre-site</phase> <phase>site</phase> <phase>post-site</phase> <phase>site-deploy</phase> </phases> <default-phases> <site>org.apache.maven.plugins:maven-site-plugin:site</site> <site-deploy>org.apache.maven.plugins:maven-site-plugin:deploy</site-deploy> </default-phases> </lifecycle>
每个phase绑定一些goal,这些goal就是在plugins中定义的。
Maven从命令行中运行有两种方式
- mvn 某一个phase
- mvn 某一个goal
当然可以是一组phase,或者一组goal,设置可以是一组phase和一组goal一起执行
Maven 运行一个phase
运行过程:
- 根据phase找到具体的lifecyle,并找到该lifecyle中该phase以前的所有phase集合并包括本身的phase
- 根据这些phase集合,绑定每个phase中plugins的goals集合,一些phase中邦定的goal是系统指定的,比如针对jar的项目
<lifecycle> <id>default</id> <phases> <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources> <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile> <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources> <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile> <test>org.apache.maven.plugins:maven-surefire-plugin:test</test> <package>org.apache.maven.plugins:maven-jar-plugin:jar</package> <install>org.apache.maven.plugins:maven-install-plugin:install</install> <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy> </phases> </lifecycle>
- 用户也可以在相关的phase中指定自己的goal,在pom文件描述比如:
<build> <plugins> <plugin>***</plugin> <executions> <execution>**</execution> </executions> </plugins> </build>
- 这些goal运行都是一个线程,而且都是使用自己的classloader,都是maven平台的classloader的child.
Maven 运行一个goal
效果跟运行一个phase差不多,不过就是只是运行一个goal而已,当然我们也可以指定这个goal运行时,必须运
行其他的goal或者运行一个phase,这就是牵涉到maven-plugin开发
Maven plugins开发
maven plugins开发模式类似javadoc的annoation,当然如果你够猛,也可以直接写plugin.xml,因为这个东西是在
runtime过程中真正被maven用到的,不过maven可以根据plugin的annoation生产plugin.xml
每一个goal就是AbstractMojo的子类
他有以下annoation
@goal: 名称
@phase: 说明这个goal绑定的phase,当然这个是可以override
@execute goal="othergoal" 说明运行这个goal的时候,必须先运行othergoal
@execute phase="**" 说明运行这个goal的时候,必须先运行指定的phase
@execute lifecyle="**" phase="**" 跟上面差不多,不过这个phase在指定的lifecyle里面,lifecyle除了其他定义的,我们也可以定义自己的