依赖的传递
疑问:在MakeFriends工程中没有依赖Hello这个jar包,却能够在MakeFriends中使用Hello jar包中的程序,这是为什么呢?
MakeFriends工程的pom.xml
HelloFriend工程的pom.xml
Hello工程的pom.xml
如果依赖jar包的范围是compile,则这个jar包可以进行传递,比如在A工程中依赖b.jar,b.jar中依赖c.jar,如果A工程工程中对b.jar的依赖是compile范围,b.jar中依赖的c.jar也是compile范围,则b.jar会将依赖的c.jar传递给A工程。
依赖的排除
当我们当前工程中依赖了B jar包,而B jar包又依赖了C jar包,如果依赖的方位是compile范围,这个时候C jar包就会被B jar包传递给当前工程,如果说依赖自动传递的C jar包是一个不稳定版本的jar包,或者对当前的工程会产生影响,那么我们当前工程可以在依赖B jar包的时候将传递过来的C jar包排除。
依赖的原则
- jar包冲突解决原则
在MakeFriends中依赖了HelloFriend,HelloFriend中依赖了Hello,并且将依赖的Hello传递给了MakeFriends,现在我们在MakeFriends中直接依赖Hello,这个时候有两个Hello,造成了冲突,那么MakeFriends中使用哪个Hello呢?
① 路径最短者优先
② 路径相同时,先声明者优先
统一管理依赖的jar包版本
比如我们在开发SSM工程的时候,我们需要依赖很多的Spring的jar包,那么这些Spring jar包如core ,beans,context,aop,excepress等等,肯定使用同一个版本的,这个时候我们最好统一声明版本,这样有利于我们jar包的升级。
//声明版本
<properties>
<wage.spring.version>5.1.5.RELEASE</wage.spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
//在version用引用
<version>${wage.spring.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${wanbang.spring.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${wage.spring.version}</version>
<scope>compile</scope>
</dependency>