欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Maven - 坐标、依赖、生命周期

程序员文章站 2023-12-28 12:12:10
...

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
    这是一个很少见的元素,大多数时候我们都没有使用到它,我们称它为附属构件,举个使用此项的例子,首先打开下面的网址:

    http://maven.aliyun.com/nexus/#nexus-search;quick~fastjson

    在列表内的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 - 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
相关标签: Maven

上一篇:

下一篇: