目录
一、依赖管理
1、基本概念
当A jar包需要用到B jar包中的类时,我们就说A对B有依赖。例如:commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar。
通过第二个Maven工程我们已经看到,当前工程会到本地仓库中根据坐标查找它所依赖的jar包。
配置的基本形式是使用dependency标签指定目标jar包的坐标。例如:
<dependency>
<!--坐标-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<!--依赖的范围-->
<scope>test</scope>
</dependency>
2、直接依赖和间接依赖
如果A依赖B,B依赖C,`那么A→B和B→C都是直接依赖,而A→C是间接依赖。
二、依赖范围
1、compile
[1]main目录下的Java代码****可以****访问这个范围的依赖
[2]test目录下的Java代码****可以****访问这个范围的依赖
[3]部署到Tomcat服务器上运行时****要****放在WEB-INF的lib目录下
例如:对Hello的依赖。主程序、测试程序和服务器运行时都需要用到。
2、test
[1]main目录下的Java代码****不能****访问这个范围的依赖
[2]test目录下的Java代码****可以****访问这个范围的依赖
[3]部署到Tomcat服务器上运行时****不会****放在WEB-INF的lib目录下
例如:对junit的依赖。仅仅是测试程序部分需要。
3、provided
[1]main目录下的Java代码****可以****访问这个范围的依赖
[2]test目录下的Java代码****可以****访问这个范围的依赖
[3]部署到Tomcat服务器上运行时****不会****放在WEB-INF的lib目录下
例如:servlet-api在服务器上运行时,Servlet容器会提供相关API,所以部署的时候不需要。
4、其他:runtime、import、system等。
各个依赖范围的作用可以概括为下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
三、依赖的传递性
当存在间接依赖的情况时,主工程对间接依赖的jar可以访问吗?这要看间接依赖的jar包引入时的依赖范围——只有依赖范围为compile时可以访问。例如:
Maven工程 依赖范围 对A的可见性
A B C compile √
D test ×
E provided ×
四、依赖的原则:解决jar包冲突
1、路径最短者优先
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
2、路径相同时先声明者优先
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
这里“声明”的先后顺序指的是dependency标签配置的先后顺序。
五、依赖的排除
1、有的时候为了确保程序正确可以将有可能重复的间接依赖排除。请看如下的例子:
假设当前工程为MakeFriend,直接依赖OurFriends。
OurFriends依赖commons-logging的1.1.1对于MakeFriend来说是间接依赖。
当前工程MakeFriend直接依赖commons-logging的1.1.2
加入exclusions配置后可以在依赖OurFriends的时候排除版本为1.1.1的commons-logging的间 接依赖
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>OurFriends</artifactId>
<version>1.0-SNAPSHOT</version>
<!--依赖排除-->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.2</version>
</dependency>