依赖声明:
依赖声明主要包含如下元素:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
也可以用来声明父类中的依赖(这里的parent是继承的原因,继承的父类中的pom),在Hello项目的pom.xml文件中声明了一个依赖(代码如上),但是MavenDependencies中出现了两个jar包
主要原因是junit和hamcrest是两个不同的框架,不同的东西,只不过junit使用了hamcrest框架而已(我觉得此处也可以说junit依赖于hamcrest)从依赖的传递性来讲这有两个jar包。
而在HelloFriend中声明了两个依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.rjxy.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
分别是依赖与Hello和junit,根据依赖的传递性所以在HelloFriend的MavenDependencies中存在3个依赖
依赖的传递性:
然后在MakeFriends中声明三个依赖后:
<parent>
<groupId>cn.rjxy.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../Parent/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>cn.rjxy.maven</groupId>
<artifactId>HelloFriend</artifactId>
</dependency>
</dependencies>
可想而知在MakeFriends的MavenDependencies中会有4和依赖,分别是junit,hamcrest,Hello,HelloFriend
这就是maven中的最简单的依赖。且maven中最简单的依赖传递性规则是:
传递性依赖和可选依赖
a.路径最近者优先
b.路径相同,第一声明者优先
在Hello中继续添加依赖:
多加了一个1.2.16版本的log4j
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
在Hello Friends里面再声明一个1.2.14版本的log4j依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.rjxy.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
此时打开HelloFriends的mavenDependencies中出现的是1.2.14版本的log4j
由此可见,依赖传递时路径最近者优先。而路径相同,第一声明者优先也一样。