maven基本概念

来源:互联网 发布:登山鞋知乎 编辑:程序博客网 时间:2024/04/30 11:00

maven作为构建工具,在现在的项目中应用的很广泛,个人觉得它上手很快,而且maven的约定是很符合大部分项目的结构的。

下面主要介绍下maven的基本概念。

1、坐标和依赖

坐标:groupID,artifactID,version是必须的,packaging是可选的,默认是jar。

groupID:maven项目隶属的实际项目。例如:org.springframework

artifactID:maven项目名。例如:spring-core

version:maven项目的版本号。例如:4.0.2.RELEASE。(这个是稳定的版本号,还有一中快照的版本号,是在平时还在开发过程中的项目用到的,因为它的不稳定性,一般不建议用来被其他项目依赖。)

packaging:maven项目的打包方式。目前常见的有三种打包方式:jar、war、pom。pom一般用在聚合和继承的maven项目中,为了更好的管理依赖的jar包。

classifier:暂未用到过。


依赖

groupID,artifactID,version:依赖的基本坐标,根据基本坐标才能找到唯一的依赖。

type:依赖类型,对应坐标的packaging,默认也是jar。

scope:依赖范围。

optical:标记依赖是否可选。

exclusions:用来排除传递依赖。


依赖范围

依赖范围编译有效?测试有效?运行有效?例子compile

Y

Y

Y

spring-core

test 

Y

 

Junit

provided

Y

Y

 

servlet-api

runtime 

Y

Y

JDBD驱动实现

system 

Y

Y

本地类库

除上述依赖范围外,还有一个依赖范围:import,这个依赖范围只能用在依赖配置(dependencyManagement)中,不能用在依赖(dependency)中。


依赖传递

A依赖于B,B依赖于C,A对B是第一直接依赖,B对C是第二直接依赖,A对C是传递性依赖。

第一依赖\第二依赖compiletestprovidedruntimecompile

compile

  

runtime

test

test

  

test

provided

provided

 

provided

provided

runtime

runtime

  

runtime

注:system为本地依赖,传递不了。


依赖调解

因为有传递依赖,可能一个依赖被依赖多次,版本号也有可能不一致,基于此,所以maven有默认的依赖调解机制。

依赖调解两大原则:1、路径最近者优先;2、第一声明者优先。


可选依赖(基本不用)

如果A依赖于B,B可选依赖于C,A不会依赖于C。


排除依赖

如果A依赖于B,B依赖于C,A不想要C的传递依赖,可在A依赖于B的配置中加入排除C的依赖即可。


归类依赖(常用)

例如maven的properties属性定义一些全局的变量(例如Spring的版本号),在依赖的时候引用定义的全局属性值即可,在版本一致时常用,版本升级时方便。


2、maven仓库

maven寻找构建的时候,会先到本地仓库去查找,如果本地仓库存在,会直接使用;如果不存在或者需要查看是否有更新的版本(例如快照版本的依赖),maven就会去远程仓库找,找到以后现在到本地仓库,在使用此构建;如果本地和远程都没有找到的话,就会报错。

maven仓库分为本地仓库和远程仓库,远程仓库分为中央仓库,私服和其他公共类库。

本地仓库的路径一般是C:\Users\[用户名]\.m2\repository,也可以通过修改settings.xml文件里【localRepository】的值来改变本地仓库的路径,IDE中可以通过配置M2_REPO的值来改变maven本地仓库地址,不过一般不建议在IDE中用maven。

中央仓库默认是在超级pom中定义的,maven2中的超级pom定义在文件路径类似于M2_HOME/lib/maven-2.2.1-uber.jar里,maven3中超级pom的定义在文件路径类似于M2_HOME/lib/maven-model-builder-3.2.3.jar里。远程仓库是以ID为唯一标识的,中央仓库的ID是central,如果在配置一个仓库ID为central的仓库,就会覆盖掉之前的中央仓库的配置。


3、生命周期与插件

maven的生命周期是对所有构建过程的抽象和统一。几乎包含了所有的构建步骤:清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等。


maven有三套独立的生命周期:clean生命周期,default生命周期,site生命周期。

clean生命周期:主要目的是清理项目。包括pre-clean、clean、post-clean三个阶段。

default生命周期:项目构建时所需要执行的步骤。

包括以下阶段:validate、initialize、generate-sources、process-sources、generate-resources、process-resources、compile、

process-classes、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。

site生命周期:目的是建立和发布项目站点。包括pre-site、site、post-site、site-deploy。

例:mvn clean install命令就是调用clean生命周期的clean阶段,然后调用default生命周期的install阶段。


maven的生命周期是抽象的,本身并不做实际的事情,实际的事情全部是交由插件的完成的。

生命周期与插件的绑定是通过插件目标绑定的,一个插件可以有多个插件目标。一个插件目标就对应一个功能,可以通过命令行mvn 插件名:目标直接使用,也可以把插件目标绑定到生命周期的具体阶段。

maven不需要任何配置就能构建maven项目,因为maven为一些核心的生命周期阶段绑定了很多插件目标,当用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务。


***内容参考《maven实战》



1 0
原创粉丝点击