本文主要的内容是依赖的范围、依赖的传递性和依赖的排除
依赖的范围
依赖的范围:采用<dependency>声明的依赖可以通过<scope>的值来确定可以使用依赖的范围。并不是只要在<denpendcy>中声明的依赖就能处处使用。
范围的标签是:<scope>默认值是compile。下表是依赖的三个scope的值以及使用的范围。
在主程序中是否可用 | 在测试程序中是否可用 | 是否参与打包 | ||
test | 否 | 是 | 否 | 跟单元测试相关的依赖,比如junit |
compile | 是 | 是 | 是 | 绝大多数依赖 |
provided | 是 | 是 | 否 | web服务器已经提供的依赖比如:servlet和jsp |
依赖的传递性
假设A、B、C是三个maven项目,其中A依赖于B,B依赖于C。那么即使在A项目的pom.xml文件中没有明确的说明对于C的依赖,A项目也是依赖与C的,且这样的依赖可以无限传递。
根据依赖的传递性可以得出的结论是,通常情况可以在项目中设置公共工程commons并且声明所有工程都需要的公共依赖,这样可以减少项目的配置。
需要注意的是,依赖只能传递范围为compile的依赖,其他范围的依赖不能通过这样的方式来进行传递。
依赖的排除性
依赖的排除:由于依赖的传递性是maven的默认行为,有时需要排除传递来的依赖
例如A同时依赖于M和N。而M、N同时又依赖于D,且两个D的版本不同,这时对A中依赖的两个D的版本不一致会产生依赖冲突,导致构建失败,这时就需要进行依赖的排除。
依赖的排除又两种方法。
方式一,在声明依赖处使用标签<exclusions>进行依赖的排除,适合单处排除
<dependency>
<groupId>org.example.maven</groupId>
<artifactId>maven-dependencied</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<!--排除来自maven-dependencied中关于log4j的依赖-->
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
方式二,在原声明依赖处排除,适合多处依赖排除使用<optional>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
<optional>true</optional><!--表示这个依赖只在这一处使用,不进行依赖的传递-->
</dependency>
</dependencies>
关于依赖的冲突maven也提供了自己默认的解决冲突的原则,但是并不推荐使用。
- 最短路径原则:路径不一样的时候取最短路径
- 路径一样的时候,最先声明原则。取先声明的依赖