依赖的元素
groupId、artifactId、version:依赖的基本坐标;
type:依赖的类型,默认为jar;
scope:依赖的范围;
optional:依赖是否可选;
exclusions:排除传递性依赖
依赖的范围
依赖范围 | 编译classpath有效 | 测试classpath有效 | 运行classpath有效 |
---|---|---|---|
compile | √ | √ | √ |
test | √ | ||
provided | √ | √ | |
runtime | √ | √ |
依赖范围用来控制依赖与编译classpath、测试classpath、运行classpath的关系
- compile:编译依赖范围,默认使用该依赖范围(对编译、测试、运行三种classpath都有效);
- test:测试依赖范围(只对测试classpath有效);
- provided:已提供依赖范围(对编译和测试classpath有效,在运行时无效);
- runtime:运行时依赖范围(对测试和运行classpath有效,在编译时无效);
传递性依赖
Maven会解析各个直接依赖的POM,将必要的间接依赖,以传递性依赖的形式引入到当前的项目中
- | compile | test | provided | runtime |
---|---|---|---|---|
compile | compile | - | - | runtime |
test | test | - | - | test |
provided | provided | - | provided | provided |
runtime | runtime | - | - | runtime |
1.第二依赖的范围是compile,传递性依赖的范围与第一直接依赖的范围一致;
2.第二依赖的范围是test,不传递依赖;
3.第二依赖的范围是provided,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样为provided;
4.第二依赖的范围是runtime,传递性依赖的范围与第一直接依赖的范围一致(compile例外,它的为runtime);
依赖调解
第一原则:路径最近者优先;
第二原则:第一声明者优先;
可选依赖
可选依赖只对当前项目产生影响,对于其他项目而言,不会被传递
最佳实践
排除依赖:使用exclusions排除不想引入的依赖
归类依赖:使用properties定义子元素,${子元素}都会替换成相应的实际值
优化依赖:使用list、tree、analyze来分析优化依赖
小结
我们开发总会依赖一些jar包,当然它们本身也不可避免的在依赖其他jar包实现自己的功能;
现在,有了Maven,通过依赖管理,我们就可以精准的控制的获取与控制我们需要的jar包