生命周期
maven包含三套生命周期,每套生命周期中包含多个阶段,每套生命周期内的阶段有前后依赖关系,但是不同生命周期的阶段之间是相互独立的:
- clean:清理项目(主要是删除target目录下的内容)
- default:构建项目,包含编译、测试、安装(把编译出来的构建拷贝到本地仓库)、部署(拷贝到远程仓库)等几个主要阶段(详细参见附1default生命周期)
- site:建立和发布项目站点,Maven可以基于POM所包含的信息自动生成一个友好的站点,方便团队交流。这个对于团队开发比较有帮助,个人开发很少会使用。
插件
1,目标
maven只是定义了抽象的生命周期,具体的功能实现还是需要交由插件来完成(插件也是maven的一种构件)
每个插件都会包含多个目标,每个目标对应一个功能,这些可以通过查看插件相关信息来获取,写法:插件前缀:该插件目标。例如compiler:compile表示插件maven-compiler-plugin的compile目标。
生命周期与插件的目标相互绑定,来完成某个具体的构建任务。
2,插件内置绑定
为了能让用户几乎不用任何配置就能构建maven项目,maven在核心为一些主要的生命周期阶段绑定了很多插件的目标。如下分别对应三套生命周期的内置插件绑定。
3,自定义绑定
用户可以在pom.xml文件中配置将某个插件目标绑定到生命周期的某个阶段上(一般内置绑定已经够用),这种配置方法的常见的例子是拷贝项目的依赖包到target/lib/目录下,创建项目的源码jar包,内置的插件绑定关系中并没有涉及这些任务,因此需要用户自行配置。
例如想在verify阶段将项目的主代码打包成jar文件,就可以如下配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-source</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
例如想在打包阶段拷贝项目的依赖包(主要用于构建可执行的jar包),可以如下配置
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- ${project.build.directory}为Maven内置变量,缺省为target -->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!-- 表示是否不包含间接依赖的包 -->
<excludeTransitive>false</excludeTransitive>
<!-- 表示复制的jar文件去掉版本信息 -->
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
说明:
- 自定义绑定是在<execution/>标签中配置的
- <id/>标签配置自定义绑定任务的唯一ID
- <phase/>标签配置生命周期的阶段
- <goals/>标签配置插件的目标
- <configuration/>标签与<goals/>标签同级配置插件目标的参数,也可以和插件的坐标同级来配置插件的全局配置
4,命令行中执行
几种常见的命令行执行内置绑定的方法
- mvn clean:该命令调用clean生命周期的clean阶段
- mvn test:该命令调用default生命周期的test阶段(即从validate、initialize一直到test阶段)
- mvn clean install:该命令调用clean生命周期的clean阶段和default生命周期的install阶段(即从validate、initialize一直到install阶段)
- mvn clean deploy sit-deploy:谇命令调用命令调用clean生命周期的clean阶段、default生命周期的deploy阶段以及site生命周期的site-deploy阶段。
还可以直接用[插件前缀:插件目标]的方式来调用,如下
- mvn dependency:list:查看项目依赖的构件列表
5,eclipse中配置执行maven任务
在eclipse中右键点击maven项目名找到run里面会有maven的一些执行任务,如下所示
如果这些默认的执行任务不能满足要求,也可以选中上图中的第2个Maven build...,会出现如下配置,或在在goals中填入相应的任务即可,格式为:插件前缀:插件目标(例如compiler:testCompile),如果有参数也可以在下图第二个红框中添加,最后点击Run按钮即可。
6,插件仓库
与依赖构件一样,插件构件同样基于坐标存储在maven仓库中,不过插件仓库是单独仓库,在配置文件的<pluginRepositories/>标签中配置,如下
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>https://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
另外,如果在pom中配置的插件是maven官方插件的话,在<plugin/>配置中可以省略groupId,这是maven默认插件groupId是org.apache.maven.plugins,这就是maven官方插件的groupId。
7,插件信息查询
在命令行下进入到项目pom.xml所在目录,执行命令:mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddeftail,其中粗体部分是需要查询的插件的坐标,需要在pom.xml中已经配置才可以查询到
还可以在线查询,maven官方插件列表在http://maven.apache.org/plugins/index.html页面找到。
附
附1,defalut生命周期:
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources 复制并处理资源文件,至目标目录,准备打包。
- compile 编译项目的源代码。
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources 复制并处理资源文件,至目标测试目录。
- test-compile 编译测试源代码。
- process-test-classes
- test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
- prepare-package
- package 接受编译好的代码,打包成可发布的格式,如 JAR 。
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包安装至本地仓库,以让其它项目依赖。
- deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
附2,常用插件列表
插件名称 | 用途 | 来源 |
maven –clean -plugin | 清理项目 | Apache |
maven –compile -plugin | 编译项目 | Apache |
maven –deploy -plugin | 部署项目 | Apache |
maven –install -plugin | 安装项目 | Apache |
maven –resources -plugin | 处理资源文件 | Apache |
maven –site -plugin | 生成站点 | Apache |
maven –surefire -plugin | 执行测试 | Apache |
maven –jar -plugin | 构建JAR项目 | Apache |
maven –war -plugiin | 构建war项目 | Apache |
maven –shade -plugin | 构建包含遗憾的JAR包 | Apache |
maven –changelog -plugin | 生产版本控制变更报告 | Apache |
maven –checkstyle -plugin | 生成checkStyle报告 | Apache |
maven –javadoc –plugin | 生成JavaDoc文档 | Apache |
maven –jxr –plugin | 生成源码交叉引用文档 | Apache |
maven –pmd –plugin | 生成PMD报告 | Apache |
maven –project –info -reports –plugin | 生成项目信息报告 | Apache |
maven –surefire –plugin | 生成单元测试报告 | Apache |
maven –antrun –plugin | 调用Ant任务 | Apache |
maven -archetype –plugin | 基于Archetype生成项目骨架 | Apache |
maven –assembly –plugin | 构建自定义格式的分布包 | Apache |
maven –dependency –plugin | 依赖分析及控制 | Apache |
maven –enforcer –plugin | 定义规则并强制要求遵守 | Apache |
maven –pgp –plugin | 为项目构建生成PGP签名 | Apache |
maven -invoke –plugin | 自动运行Maven项目构建并验证 | Apache |
maven –release –plugin | 自动项目版本发布 | Apache |
maven –scm –plugin | 集成版本控制系统 | Apache |
maven –source –plugin | 生成源码包 | Apache |
maven –eclipse –plugin | 生成Eclipse项目环境变量 | Apache |
jboss –maven –plugin | 启动、停止Jboss,部署项目 | Codehaus |
properties –maven –plugin | 从properties文件读写Maven属性 | Codehaus |
sql –maven –plugin | 运行SQL脚本 | Codehaus |
tomcat –maven –plugin | 启动、停止、部署项目 | Codehaus |
versions –maven –plugin | 自动化批量更新POM版本 | Codehaus |
cargo –maven –plugin | 启动/停止/配置各类Web容器自动化部署Web项目 | Cargo |
jetty –maven –plugin | 集成jetty容器,实现快速开发测试 | Eclipse |
maven –gae –plugin | 集成Google APP Engine | Googlecode |
maven –android –plugin | 构建Android项目 | Googlecode |
附3,参考
《maven实战》
http://juvenshun.iteye.com/blog/213959
http://www.cnblogs.com/tonychanleader/archive/2013/05/11/3072703.html