Road Map
1 Maven 中的三套生命周期
在maven中,其实是有三套相互独立的生命周期(Lifecycle),而不是我们以为的一套生命周期,准确地来说,在maven的世界,它有自己的一套生命周期管理的技术体系,在这套体系中,maven为我们定义了三套互相不影响的生命周期。它们分别是clean,default和site。 其中clean 和default最为常用了。
此外呢,每套生命周期 都有若干个生命周期阶段(phase)。其中每套生命周期中的阶段都依赖于前一个阶段,以 clean 生命周期为例。 clean 生命周期 它包含了 三个阶段,pre-clean, clean, post-clean. Clean 依赖与pre-clean, post-clean依赖与clean,也就是说,当我们执行clean 阶段的时候, pre-clean 也会被执行。
下面会详细介绍下三套生命周期
1.1 Clean 生命周期
clean 生命周期的目的是情理项目,它包含了三个阶段:
pre-clean 执行一次清理前需要完成的工作
clean 执行清理工作
post-clean 执行一些清理后要完成的工作
1.2 Default 生命周期
default 生命周期定义了真正构建时所需要执行的所有的步骤,它是所有生命周期中最核心的部分,它包括如下的阶段
生命周期阶段 | 描述 |
validate | 验证项目是否正确,以及所有为了完整构建必要的信息。 |
initialize | |
generate-sources | 生成所有需要包含在编译过程中的源代码 |
process-sources | 处理源代码 |
generate-resources | 生成所需要的包含在打包过程中的资源文件 |
process-resources | 处理项目主资源文件。一般来说,是对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中 |
compile | 编译项目的主源码。一般来说,是编译src/main/java目录下的Java文件至项目输出的主classpath目录中 |
process-classes | 处理编译生成的文件 如.class文件 |
generate-test-sources | 生成所有包含在测试编译过程中的测试源码 |
process-test-sources | 处理测试源码 |
generate-test-resources | 生成厕所需要的资源文件 |
process-test-resources | 复制并处理测试次元文件到测试目标目录 |
test-compile | 编译测试代码 |
process-test-classes | 处理 编译测试文件 |
test | 执行测试 |
prepare-package | 在真正打包之前,执行一些准备打包的必要操作 |
package | 将编译好的代码打包成需要的格式 |
pre-integration-test | 执行一些在集成测试前的需要动作 |
integration-test | 处理包并发布到集成测试环境 |
post-integration-test | 执行一些在集成测试运行之后需要的动作 |
verify | 执行所有检查,验证包是否有效 |
install | 安装包至本地仓库 |
deploy | 复制包到远程仓库,共享给其他开发人员和项目 |
1.3 Site 生命周期
Site 生命周期的目的是建立和发布项目站点,Maven 能够基于 POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布信息。它包含了如下4个阶段
pre-site 执行项目生成前的工作
site 生成项目站点文档
post-site 执行生成站点后的工作
site-deploy 将生成的项目站点发布到服务器上
1.4 命令行与生命周期
从maven的命令行中,可以看出 执行maven 任务最主要的方式 就是调用maven的生命周期阶段。需要注意的是,这三套生命周期,是相互独立的,只有在同一个生命周期里面的阶段 具有依赖关系。
以 mvn test 为例,该命令调用defaul生命周期的test阶段。实际执行的阶段为default生命周期的 validate,initialize等
直到test的所有阶段。这也解释了在执行测试的时候,项目源代码也会得到编译。
2 插件管理
2.1 插件目标(plugin goal)
Maven 定义了抽象的生命周期,具体的任务是由插件完成的,插件以独立的构件形式存在,因此,Maven本身并不大,在实际应用中会下载很多插件。
插件本身而言,为了能够复用代码,往往能够完成多个任务。所以针对每个任务单独写一个插件,显得过于浪费,或者使得插件库过于庞大,因此maven就将每个功能设定成目标。
如 maven-dependency-plugin有十几个目标,每个目标对应一个功能。
mvn dependency:analyze
mvn dependency:tree
mvn dependency:list
2.2 插件绑定
Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言,生命周期的阶段与插件的目标相互绑定,完成某个具体的构建任务。
2.3 内置绑定
Maven 默认给生命周期的各阶段绑定了内置的一些插件目标,方便用户。当通过maven命令执行生命周期的时候,会找到对应的绑定的插件目标,完成相应的任务
生命周期阶段 | 插件 |
pre-clean | maven-clean-plugin:clean |
clean | maven-clean-plugin:clean |
post-clean | maven-clean-plugin:clean |
process-resources | maven-resources-plugin:resources |
compile | maven-compiler-plugin:compile |
process-test-resources | maven-resources-plugin:testResources |
test-compile | maven-compiler-plugin:testCompile |
test | maven-surefire-plugin:test |
package | maven-jar-plugin:jar |
install | maven-deploy-plugin:install |
deploy | maven-deploy-plugin:deploy |
pre-site | maven-site-plugin:site |
site | maven-site-plugin:site |
post-site | maven-site-plugin:site |
site-deploy | maven-site-plugin:deploy |
2.4 自定义绑定
除了内置绑定以外,用户还能够选择将某个插件目标绑定到生命周期的某个阶段上
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1></version>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</plugin>
</plugins>
</build>
2.5 插件配置
插件不是固定执行,可以通过传递一些参数,进一步调正任务执行
2.5.1 命令行插件配置
在命令行执行任务的时候可以通过 -D参数 并伴随一个键值对,来配置插件目标参数
mvn install -Dmaven.test.skip=true
2.5.2 POM插件全局配置
并不是所有插件的参数 都适合在命令行配置,MAVEN提供了在pom配置文件里面配置全局的配置.
在pom里面生命插件的时候 可以在节点 <configuration>下面配置对应的参数
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
2.5.3 POM插件任务配置
针对任务目标的配置也是可以的
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1></version>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
<configuration>
<tasks>
<echo>I'm jar-no-fork</echo>
</tasks>
</configuration>
</execution>
</plugin>
</plugins>
</build>
来源:oschina
链接:https://my.oschina.net/u/1041012/blog/505811