Maven 生命周期
Maven拥有三套相互独立的生命周期,分别为clean、default和site。
每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期。
mvn [阶段名] [阶段名] [阶段名]
例:
mvn clean deploy site-deploy
- 执行clean生命周期中clean阶段及以上的所有阶段
- 然后执行default生命周期中deploy阶段及以上的所有阶段
- 最后执行site生命周期中site-deploy阶段及以上的所有阶段
clean 生命周期
阶段 | 处理的任务 | 描述 |
---|---|---|
pre-clean | 执行一些清理前需要完成的工作 | |
clean | 清理上一次构建生成的文件 | |
post-clean | 执行一些清理后需要完成的工作 |
default 生命周期
default生命周期定义了真正构建时所需要执行的步骤,它是所有生命周期中最核心的部分
阶段 | 处理的任务 | 描述 |
---|---|---|
valivate | ||
initialize | ||
generate-sources | ||
process-resources准备资源 | 复制资源文件 | 资源文件如何复制可以在此阶段定制,一般来说,是将src/main/resources目录的内容进行变量替换工作后,赋值到项目输出的主classpath目录中 |
compile编译 | 编译 | 源代码编译在此阶段完成,编译Java文件到项目输出的主classpath目录中 |
generate-test-recources | ||
process-test-resources | ||
test-compile | ||
test | 使用单元测试框架运行测试 | 测试代码不会被打包或部署 |
package打包 | 打包 | 此阶段按照pom.xml的设置创建JAR或者WAR包 |
install安装 | 安装 | 将包安装到本地仓库,供本地其它Maven项目使用 |
deploy | 部署 | 将最终的包复制到远程仓库,供其它来发人员和Maven项目使用 |
site 生命周期
阶段 | 处理的任务 | 描述 |
---|---|---|
pre-site | ||
site | 生成项目站点文档 | |
post-site | ||
site-deploy | 将生成的项目站点发布到服务器上 |
Maven 插件
Maven实际上是一个执行插件的框架,其所有的任务其实都是有插件完成。这种思想与涉及模式中的模板方法非常相似,模板方法模式在父类中定义算法的整体结构,子类可以通过实现或者重写父类的方法来控制实际的行为,这样既保证了算法有足够的可扩展性,又能够严格控制算法的整体结构。
Maven插件通常用于:
- 生成jar包文件
- 生成war包文件
- 编译源码文件
- 代码单元测试
- 生成项目报告
一个插件通常提供一系列的目标操作,并且目标操作可以通过以下格式命令执行:
mvn [插件名]:[目标操作名]
插件绑定
Maven的生命周期的阶段与插件相互绑定,用以完成实际的构建任务。例如,项目编译这一任务,它对应了default生命周期的compile阶段,而maven-compile-plugin这一插件的compile目标能够完成该任务,于是就它们绑定。
内置插件
Maven为一些主要的生命周期阶段绑定了很多插件的目标,当用户通过命令行调用生命周期阶段时,对应的内置插件目标就会执行相应的任务。
自定义绑定
除了内置绑定之外,还可以自己选择某个插件目标绑定到生命周期的某个阶段上。
例:使用maven-source-plugin插件的jar-no-fork目标将项目的主代码打包成jar文件,将其绑定到default生命周期的verify阶段上,在执行完集成测试后和安装构件之前创建源码jar包。
<build>
<plugins>
<plugin>
<groupId>org.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
插件配置
命令行插件配置
很多插件目标的参数都支持从命令行配置,用户可以在Maven命令中使用-D参数,并伴随一个参数键=参数值的形式,来配置插件目标的参数。
例如:maven-surefire-plugin提供了一个maven.test.skip参数,当其值为true的时候就会跳过执行测试
mvn install -Dmaven.test.skip=true
POM中插件全局配置
例:配置maven-compiler-plugin告诉它编译Java1.5版本的源文件,生成与JVM1.5兼容的字节码文件。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
POM中插件任务配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>21.3</version>
<executions>
<execution>
<id>ant-validate</id>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>I`m bound to validate phase.</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>ant-verify</id>
<phase>verify</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>I`m bound to validate phase.</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>