Maven坐标
坐标在人们的心中大概就是这样一个东西:
(x,y)
可能对于快递员来说,这样的东西也算是一个坐标:
xx市xx区xx路xx楼xx号
在Maven的世界中,拥有数量巨大的构件(jar、war等),我们很难想象怎样合理的去区分它们(唯一标识这些构件)。很幸运,Maven有这样一个东西来解决这个问题,我们称它为坐标,如果我们将坐标理解为一个地址,那么地址指向的就是构件。Maven规定了世界上任意一个构件都可以使用Maven坐标来唯一标识,很显然,这是一种规则,是规则,就要学习并遵守。
Maven坐标组成
Maven坐标由5个元素构成:
groupId、artifactId、version、packaging、classifier
上个例子:
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<packaging>jar</packaging>
<version>2.1</version>
groupId
我们很容易想到这可能和构件的开发组织有关,就像上面的org.apache,当然也可能是公司,比如com.alibaba。我们将这个元素称为当前构件所属的实际项目,那么例子中定义的构件就隶属于org.apache.maven.plugins这个项目,使用过maven的都知道,maven的官方插件有很多,上面的例子就是其中的一个,这样的例子还有很多,比如SpringFramework。当然也有实际项目仅含一个构件的情况,比如阿里巴巴的fastjson。简而言之,groupId代表的就是实际项目名称了。artifactId
artifact的中文译为构件,这个词汇我们在之前提到过很多次,你可以将它理解为项目的模块或是子项目,比如上面例子中定义的artifact就是org.apache.maven.plugins这个实际项目的一个模块或子项目,当然,有时候实际项目只含有一个模块或子项目,我们也可以将实际项目与构件等价起来。很显然,artifactId就是构件的名称了。version
显而易见,当前构件的版本号。在我们的印象中版本号大多都是1.0、1.5、2.0之类的数字集合,其实不然,版本号应该表现出当前构件的状态,就像我们初始化一个maven项目时,自动填充的版本号1.0-SNAPSHOT一样,它代表了这是一个快照,正在开发阶段,所以你可以根据开发情况来修改你的version(1.0-test、1.0-beta等)。classifier
这是一个很少见的元素,大多数时候我们都没有使用到它,我们称它为附属构件,举个使用此项的例子,首先打开下面的网址:在列表内的group列找到com.alibaba并点击,然后在下方的框中选择任意版本,你会发现,在此版本下,jar包不止一个,可能是下面这个样子的:
fastjson-1.2.37-javadoc.jar fastjson-1.2.37-sources.jar fastjson-1.2.37.jar
除去fastjson-1.2.37.jar的其他jar我们称之为附属构件,注意,classifier元素不能由我们手动填写,而是由特定的一些插件生成,换句话说,附属构件就是由插件生成的。
依赖
可以查看我的另一篇文章,包含了对pom.xml的全部配置的讲解:
生命周期
即Maven对项目的所有构建过程的抽象和统一,包含:
项目清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成等
Maven的生命周期是抽象的,以为着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务(编译源码等)都交由插件来完成。
生命周期解析
Maven将生命周期分为三个部分,分别是clean(清理项目)、default(构建项目)、site(生成项目站点),每个生命周期都包含一些阶段(phase),这些阶段都是有序的,且后面的阶段依赖前面的阶段。用户与Maven的直接交互就是调用这些阶段,以clean为例,包含了pre-clean、clean、post-clean,当用户调用pre-clean时,仅pre-clean阶段会执行,而调用clean时,pre-clean、clean会顺序执行。较之阶段的前后依赖关系,maven生命周期的三个部分本身是相互独立的,也就是当调用clean生命周期的任意阶段时,不会触发default、site的任意阶段的执行。另外生命周期中的每一个阶段的执行都是由插件来完成,这些插件一般是默认的,当然也可以进行配置,重要的是我们要知道这一点的前提下,去查看下面的阶段描述信息。
clean生命周期
阶段 | 描述 |
---|---|
pre-clean | 执行一些清理前的准备工作。 |
clean | 清理上一次构建生成的文件。 |
pre-clean | 执行一些清理后的工作。 |
default生命周期
default定义了真正构建时所需的所有步骤,是所有生命周期中的核心。
阶段 | 描述 |
---|---|
validate | 验证项目的正确性以及是否提供了所有必要的信息。 |
initialize | 初始化构建的状态,比如:设置属性值(properties)或创建目录。 |
generate-sources | 生成要被编译的所有源码。 |
process-sources | 处理源码,比如过滤值等。 |
generate-resources | 生成项目资源。 |
process-resources | 复制处理项目的资源文件到目标目录。 |
compile | 编译项目源码。 |
process-classes | 处理编译生成的文件,比如对class文件进行字节码加强。 |
generate-test-sources | 生成要编译的测试源码。 |
process-test-sources | 处理测试源码,比如过滤值等。 |
generate-test-resources | 生成测试资源。 |
process-test-resources | 复制处理测试资源到目标目录。 |
test-compile | 编译测试源码到目标目录。 |
process-test-classes | 处理编译测试源码生成的文件, 比如对class文件进行字节码加强。 |
test | 使用适当的单元测试框架执行测试(默认使用junit,可以配置其他插件) |
prepare-package | 在进行打包前的一系列准备工作。 |
package | 将编译的源码打包成可发布的格式,如JAR。 |
pre-integration-test | 集成测试前的准备工作,比如建立所需环境等。 |
integration-test | 处理并发布包到继承测试环境中。 |
post-integration-test | 集成测试后的工作,比如清理集成测试环境。 |
verify | 执行一些检查来确认生成的包是否有效且符合质量标准。 |
install | 安装包到本地仓库,此时可以在本地的其他项目中,通过依赖来使用。 |
deploy | 在集成或发行环境中完成,复制最终的包到远程仓库。 |
Site生命周期
阶段 | 描述 |
---|---|
pre-site | 执行一些在生成站点前的处理。 |
site | 生成项目站点文档。 |
post-site | 执行一些在生成站点后的处理,并且准备站点的部署处理。 |
site-deploy | 部署生成的站点文档到指定的web服务器。 |
内置生命周期绑定
某些阶段默认的被某些goals(目标)所绑定,也就是当我们执行某个目标时,比如mvn clean:clean,会去执行默认绑定的某个阶段(这里是clean生命周期中的clean阶段)。对于default生命周期,这种绑定依赖与packaging的值(jar、war .etc)。
Clean生命周期绑定
阶段 | 目标 |
---|---|
clean | clean:clean |
Default生命周期绑定(packaging = ejb | ejb3 | jar | par | rar | war)
阶段 | 目标 |
---|---|
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war |
install | install:install |
deploy | deploy:deploy |
Default生命周期绑定(packaging = ear)
阶段 | 目标 |
---|---|
generate-resources | ear:generate-application-xml |
process-resources | resources:resources |
package | ear:ear |
install | install:install |
deploy | deploy:deploy |
Default生命周期绑定(packaging maven-plugin)
阶段 | 目标 |
---|---|
generate-resources | plugin:descriptor |
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | jar:jar and plugin:addPluginArtifactMetadata |
install | install:install |
deploy | deploy:deploy |
Default生命周期绑定(packaging pom)
阶段 | 目标 |
---|---|
package | site:attach-descriptor |
install | install:install |
deploy | deploy:deploy |
Site生命周期绑定
阶段 | 目标 |
---|---|
site | site:site |
site-deploy | site:deploy |