标签:根目录 nbsp 一起 基础上 直接 www spring nap 依赖范围
Maven坐标:世界上任何一组构件都可以使用Maven坐标来唯一标识,Maven坐标的元素包括groupId、artifactId、version、packaging、classifier。只要我们提供正确的坐标元素,Maven就能找到对应的构件。
那么Maven是从哪里下载构件的呢?
答案其实很简单,Maven内置了一个中央仓库的地址,该中央仓库包含了世界上大部分流行的开源项目构件,Maven会在需要的时候去那里下载。
在我们开发自己项目的时候,也需要为其定义适当的坐标,这是Maven强制要求的。在这个基础上,其他Maven项目才能引用该项目生成的构件。
上述5个元素中,groupId、artifactId、version是必须定义的,packaging是可选的,而classifier是不能直接定义的。
一个依赖的声明可以包含如下的元素:
<project> ... <dependencies> <dependency> <groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <type>...</type> <scope>...</scope> <optional>...</optional> <exclusions> <exclusion> ... </exclusion> ... </exclusions> </dependency> ... </dependencies> ... </project>
根元素project下的dependencies可以包含一个或多个dependency元素,用来声明一个或者多个项目依赖。每个依赖可以包含的元素有:
大部分依赖声明只包含基本坐标,但是在某些特殊情况下,其他元素也是至关重要。
Maven因为执行一系列编译、测试和部署运行等操作,在不同的操作下使用的classpath不同,依赖范围就是用来控制依赖与三种 classpath(编译classpath、测试classpath、运行classpath)的关系,Maven有以下几种依赖范围:
依赖范围与classpath的关系:
假设有如下依赖关系:
A->B(compile) 第一关系: a依赖b compile
B->C(compile) 第二关系: b依赖c compile
当在A中配置
<dependency> <groupId>com.B</groupId> <artifactId>B</artifactId> <version>1.0</version> </dependency>
则A中会自动导入C包。
有了传递性依赖机制,Maven会解析各个直接依赖的pom,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。
假设A依赖B,B依赖C,那么A对于B是第一直接依赖,B对C是第二直接依赖,A对C是传递性依赖。
第一直接依赖的范围和第二直接依赖的范围决定了传递性依赖的范围,如下表:
Maven依赖调解的第一原则是:路径最近者优先。
Maven依赖调解的第二原则是:第一声明者优先。
例1:
A->B->C->X(1.0)
A->D->X(2.0)
此时Maven按照最短路径选择导入x(2.0)。
例2:
A->B->X(1.0)
A->D->X(2.0)
路径长度一致,则优先选择第一个声明的依赖,此时导入x(1.0)。
在声明依赖时,使用<optional>元素表示依赖为可选依赖。
<optional>true</optional>
可选依赖作用:
如果存在依赖A->B、B->X(可选)、B->Y(可选)。如果这三个依赖都是compile的,X、Y就是A的传递性依赖,但是当X、Y是可选依赖时,X、Y将不会成为A的依赖。
当A->B->C(1.0)时,此时在A项目中,如不想使用C(1.0),而使用C(2.0),则需要使用exclusion排除B对C(1.0)的依赖。并在A中引入C(2.0)。
<!--排除B对C的依赖--> <dependency> <groupId>B</groupId> <artifactId>B</artifactId> <version>0.1</version> <exclusions> <exclusion> <groupId>C</groupId> <artifactId>C</artifactId><!--无需指定要排除项目的版本号--> </exclusion> </exclusions> </dependency> <!---在A中引入C(2.0)--> <dependency> <groupId>C</groupId> <artifactId>C</artifactId> <version>2.0</version> </dependency>
<properties> <org.springframework-version>4.0.0.RELEASE</org.springframework-version> </properties> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${org.springframework-version}</version> </dependency>
Maven会自动解析所有项目的直接依赖和传递性依赖,并且根据规则正确判断每个依赖的范围,对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在,这些工作之后,最后得到那些依赖被称为已解析依赖。
cmd进入工程根目录,执行mvn命令:
参考:
《Maven实战》
标签:根目录 nbsp 一起 基础上 直接 www spring nap 依赖范围
原文地址:http://www.cnblogs.com/Jason-Xiang/p/7625847.html