您的位置:首页 > 其它

Maven 生命周期与插件

2014-09-24 09:00 239 查看
1 生命周期

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

2 生命周期详解

Maven拥有三套相互独立的生命周期,它们分别为clean、default和site。Clean生命周期的目的是清理项目,default的生命周期目的是构建项目,而site生命周期的目的是建立项目站点,这三套生命周期是相互独立的,例如当用户调用default生命周期的compiler阶段的时候,也不会触发clean生命周期的任何阶段。

2.1 Clean生命周期:

pre-clean、clean、post-clean。

2.2 default生命周期:

Default生命周期定义了真正构建时所需要执行的所有步骤,它是所有生命周期中最核心的部分,其包含阶段如下:

)validate

initialize

generate-sources

process-sources

generate-resources

process-resources

compiler

process-classes

generate-test-sources

process-test-sources

generate-test-resources

test-compiler

process-test-classes

test

prepare-package

package

pre-integration-test

integration-test

post-integration-test

verify

install

deploy

2.3 site生命周期:

site生命周期的目的是建立和发布站点

pre-site:执行一些在生成项目站点之前需要完成的工作

site:生存项目站点文档

post-site:执行一些在生成项目站点之后需要完成的工作

site-deploy:将生成的项目站点发布到服务器上

命令行与生命周期:

mvn clean: pre-clean和clean

mvn test: default生命周期validate, initialize到test有所有阶段

mvn clean install: clean生命周期的clean阶段、default生命周期的install阶段

mvn clean deploy site-deploy:clean周期的clean阶段、default生命周期的deploy阶段、site生命周期的site-deploy阶段。

3 插件目标

Maven的核心仅仅是定义了抽象的生命周期,具体任务是由插件完成了,插件以独立的形式存在,同一个插件可以做很多事情,针对每一件事情,都可以称为一个插件的目标。

Maven-dependency-plugin有十多个目标,主要有dependency:analyze、dependency:tree、dependency:list。

4 插件绑定

5 插件配置

很多插件目标的参数都支持从命令行进行配置,用户可以在maven命令中使用-D参数,并伴随一个参数键=参数值的形式,来配置插件的目标参数,例如 maven-surefire-plugins的maven.test.skip参数

mvn install –Dmaven.test.skip=true

6 获取插件信息

http://maven.apache.org/plugins/index.htm

http://repo1.maven.org/maven2/org/apache/maven/plugins

7 插件解析机制

7.1 插件仓库

与依赖构件一样,插件构件同样基于坐标存储在Maven仓库。在需要的时候,首先会从本地仓库查找,如果本地仓库不存在,就从远程插件仓库查找,然后再下载。

当Maven需要的依赖在本地仓库不存在的时候,它会去所配置的远程仓库查找,可是当Maven需要的插件在本地仓库不存在的时候,它就不会去这些远程仓库查找。

插件默认的groupId不存在的时候,会自动用默认groupId为org.apache.maven.plugins补齐,但不推荐在实际中这么用。

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">7.2 解析插件版本</span>


当用户没有指定核心插件版本的情况下,Maven会自动解析插件版本,Maven使用核心插件的时候它们的版本就已经确定了。这些插件包括maven-clean-plugin、maven-compiler-plugin、maven-surefire-plugin。

如果用户使用某个插件时没有设定版本,而这个插件又不属于核心插件的范畴,Maven就会去检查所有仓库中可用版本,然后做出选择。以maven-compiler-plugin为例,它在中央仓库的仓库元数据为http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-compiler-plugin/maven-metatata.xml。内容如下:

<?xml version=’1.0’ encoding=’UTF-8’ ?>
<metadata>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugins</artifactId>
<versioning>
<latest>2.1</latest>
<release>2.1</release>
<versions>
<version>2.0-beta-1</version>
<version>2.0</version>
<version>2.0.1</version>
<version>2.0.2</version>
<version>2.1</version>
</versions>
<lastUpdated>20100102092331</lastUpdated>
</versioning>
</metadata>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Maven遍历本地仓库和所有远程插件仓库,将该路径下的仓库元数据归并后,就能计算出latest和release的值,Maven会将版本解析为所有仓库中最新版本,而这个版本也可能是快照版本。</span>


使用插件的时候,应该一直显式地设定版本,这也解释了Maven为什么要在超级POM中为核心插件设定版本。

6.7.3 解析插件前缀

插件仓库元数据:

<metadata>
<plugins>
<plugin>
<name>Maven Clean Plugin</name>
<prefix>clean</prefix>
<artifactId>maven-clean-plugin</artifactId>
</plugin>
<plugin>
<name>Maven Compiler Plugin</name>
<prefix>compiler</prefix>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<name>Maven Dependency Plugin</name>
<prefix>dependency</prefix>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
</plugins>
</metadata>


当Maven解析到dependency:tree这样的命令后,它首先基于默认的groupId归并所有插件仓库的元数据org/apache/maven/plugins/maven-metadata.xml;其次检查归并后的元数据,找到对应的artifactId为maven-dependency-plugin,然后得到version。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: