Introduction to the Dependency Mechanism
依赖管理是maven的一个特点,使用者最应该了解的,maven最擅长的部分.依赖管理相对于一个项目来说没什么,不过当你开始应对又很多moudule 的项目或者程序的时候,可能超过10个或者百个,这个时候maven可以帮助你高度的控制和维持稳定.
Transitive Dependencies
传递依赖是maven2.0的新特色.它不需要你去发现指定你自己依赖的包所需要的依赖,包括的依赖是自动完成的. 这个功能是通过你的项目文件依赖的远程仓库所指定的依赖关系.一般所有你项目的依赖都会被下载下来,包括项目继承它的父类的依赖 等等. 没有做依赖项的数量等级限制.可能会出息那虚幻依赖的出现.
因为循环依赖,依赖包的曲线图可能增长的特别快达到相当大的程度,所以Maven附加了一些特色来限制依赖关系:
Dependency mediation 当多个version 包依赖被遇到来决定使用哪个version的包,当前Maven2.0只支持使用最近的定义(意味着它会使用的version是在项目依赖数中最靠近你项目的依赖,你也可以指定version 在pom中),如果依赖树的深度一样在mavne2.0.8 没有一个是胜利 (2个可能都存在:not try) 在maven2.0.9 中会把第一申明依赖包含的version做为依赖.
Dependency management
来决定项目在遇到传递性依赖或者依赖包没有决定version 是使用定义的依赖包verison.
它里面定义的包可以直接定义作为依赖引用或者不起到任何作用只是一个申明作为依赖包引用或者传递性依赖指定版本.
Dependency scope
依赖的生存周期:
compile:
如果没有指定生存周期,是默认的生存周期, Compile scope对项目的 classpaths 是完全开放的. 对那些依赖项目的也是具有传播性的.
provided
和compile scope 很像, but 它表示 你期望JDK或容器在运行时提供依赖.
runtime
这个scope表示的依赖在编译时不需要的,是为了运行时准备的,是作为runtime 和 test的 classpath.
test
这个scope表示修饰的依赖不是给一般的程序使用仅仅是为了编译通过
system
这个scope表示依赖和provide很相似 期望jdk或者容器来提供依赖.system scope 修饰的依赖在依赖库中你是看不到的.
import (only available in Maven 2.0.9 or later)
This scope 只能在
Excluded dependencies 如果项目x依赖项目y,项目y依赖项目z,项目x可以明确排除项目y 作为项目的依赖可以使用 "exclusion" element.
Optional dependencies 如果项目y依赖项目z,项目y把项目作为可选的依赖使用 "optional" element. 当项目x依赖项目y时,项目x会只依赖项目y不会依赖项目y的optional 依赖的项目z. 不过项目x 可以明确添加项目z 做为依赖.(不知道怎么个添加法,自动添加依赖,自动给y吗?)