一直以来对于maven都是处于一种初级使用阶段——会用,但是出了问题,并不能很好的去解决(ci过程中经常发生maven问题)。
这个问题的根本的原因在于没有对maven有一个全面的了解,包括基本的概念没有很好的深入的清晰的理解。导致出了问题,就手足无措。
所以今天决定要好好的补一补这方面的知识。
废话不多说,开始吧
先把官方文档的链接贴上,这篇文章其实大部分都将会是一个简单的翻译。当然,也不可能是逐个字逐个字的照搬过来,中间可能会有自己总结归纳后的东西。所以如果想了解更多,或者觉得我写的太烂,可以参考一下原文:)。这篇文章的一个基本的目录可以展示如下
其实整个maven体系的核心概念是建立在build lifecycle(构建的生命周期)之上的,即构建一个项目的每一个步骤都是精确定义的。
对于想构建项目的人来说,这就意味这他只需要学习一小部分的命令就足以完成maven项目的全部构建,pom会保证完成你所想要的东西。
整个构建生命周期是有多个阶段(phase)组成的。不同的构建生命周期的各个阶段也不相同。在项目构建的过程中,各个阶段的执行顺序是固定的。当你在命令行中执行某个阶段的命令的时候,他同时也会执行在这个阶段之前的所有阶段的命令(想想走楼梯,你想走到第4阶,那么毫无疑问,你得先把1、2、3这几个台阶按顺序走一遍)。
阶段这个概念其实是一个比较粗粒度的命令,他并没有很好的提供精确的职责描述。所以在阶段这个概念之下,又有了目标(goal)这个概念。一个goal代表了一项特定的任务(task),这是一个比阶段更加细的命令。goal可以绑定到多个阶段之上,当执行到这些阶段的时候,都会执行这个goal。同时,goal也能独立的出现在命令当中。goal的执行顺序是依赖于他的申明顺序以及他所绑定的阶段的执行顺序的。比如下面这个构建命令
mvn clean dependency:copy-dependencies package
首先执行clean(顺序执行绑定到clean之上的goal),然后执行dependency:copy-dependencies,最后执行 package命令进行打包。
对于goal这个概念来说,有两点需要注意一下:
- 如果goal被绑定到了多个阶段之上,那么在每个阶段,都会执行这个goal
- 如果一个阶段没有任何的goal,那么这个阶段将不会被执行。否则,就会执行绑定到这个阶段上的所有的goal
上面对项目的构建过程的一些核心概念做了说明(如phase,goal)。但是在实际的项目构建当中,是如何将这些goal和阶段链接在一起从而完成项目构建的呢?
这里其实主要有两个途径,一是packaging,一种最平常的方式。即在pom文件中,设定项目的打包方式(常见的有pom,jar,ear,war等,默认是jar)
阶段 | 绑定的目标 |
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testCompile |
test-compile | compiler:testCompile |
test | surefire:test |
package | jar:jar |
install | install:install |
deploy | deploy:deploy |
这是打jar包的时候会经历的各个阶段,以及各个阶段绑定的目标
另外一种方式是通过在pom文件中加入plugins,并且为其设定具体的目标来实现goal的设定。插件是指那些能给maven设定goal的项目。每一种插件都能为maven提供多goal。
插件在声明的过程中可以指定要实现的目标所在阶段具体的用法是
<execution>
<phase>process-test-resources</phase>
<goals>
<goal>time</goal>
</goals>
</execution>
后记:
其实从头看了下,有思想的东西不多。。基本上都是翻译的,刚开始写,很多东西需要继续去积累和了解。如果有感兴趣的同学可以一起学习:)