Maven通过依赖(dependency)来管理项目的依赖Jar包。一个典型的依赖如下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
dependency包含groupId,artifactId,version,scope,type,optional,excusions元素,前四个元素比较容易理解。其它几个要素:
- scope是为了对应构建时的三个classpath(编译,测试,运行)设置的。可选值包括:
- test:表示只对测试代码有效,在主代码中引用该Jar会报错
- compile:默认值:
- provided:编译和测试时需要,运行时不需要
- runtime:测试和运行有效,编译主代码时不需要,如JDBC驱动
- system:范围和provided完全一致,不常用
- import:使用Maven的继承机制时使用,不常用
- optional:可选依赖。如某个项目实现了数据库操作,可以依赖mysql也可以依赖oracle,对mysql和oracle的jar包就可以配置为可选依赖。其它项目如果引用了该项目的jar包,将不自动加载可选依赖的jar包。
- excusions:排除传递性依赖
依赖的重要概念:传递性依赖,直接依赖,间接依赖
项目中引入了Spring依赖(Spring称为项目的直接依赖),Spring又依赖了于其它项目(该项目称为该项目的间接依赖),在项目中只需要指定对Spring的依赖即可,Maven会根据Spring的POM自动加载间接依赖。
传递性依赖需要明确的问题
可选依赖:如果某个间接依赖为可选的,不会加载它。
项目对某给项目既是直接依赖,也有间接依赖,为了防止混乱,可以关闭某个间接依赖( 通过dependency. excusions设置),然后在项目中声明对它的直接依赖。
依赖调节
有不同的两个直接依赖有相同的间接依赖,但版本不同时如何选择版本号:
- 依赖路径短的优先
- 依赖路径相同的情况下先声明的优先
查看项目依赖的几个有用命令
- mvn dependency:list
查看项目的已解析依赖
- mvn dependency:tree
查看项目的依赖树(直接依赖,间接依赖)
- mvn dependency:analyze
显示项目依赖存在的问题:
- Used undeclared dependencies(用到但没定义为显示依赖的项目):项目中直接用到了该依赖,但使用间接依赖来引入Jar包。可能存在版本不一致的风险。
- Unused declared dependencies(没用到但定义为显示依赖的项目):代码中虽然没有显示地声明会用到该Jar包(如通过import地方式),但测试或运行时会用到如mysql驱动包,所以该报告需要谨慎分析。