依赖管理
- 依赖配置
- 依赖传送
- 依赖具有传递性
- 直接依赖与间接依赖
- 依赖冲突
- 可选依赖
- 排除依赖
- 依赖范围
依赖配置
依赖指的是当前项目所需要的jar包,在 pom.xml 中可以看到
<!--设置当前项目所依赖的所有jar包-->
<dependencies>
<!--设置一个具体的依赖jar-->
<dependency>
<!--依赖所属群组id-->
<groupId>junit</groupId>
<!--依赖所属项目id-->
<artifactId>junit</artifactId>
<!--依赖版本号-->
<version>3.8.1</version>
</dependency>
</dependencies>
依赖传送
依赖具有传递性
1、你的项目中的依赖可能依赖于别的资源,而这种依赖关系不需要你去管理,而是你的依赖会自动对其依赖进行管理;
2、你的项目依赖了同事的资源,同事的资源的依赖你不需要管理,当同时项目更新时你依赖同时的资源会自动更新依赖;
直接依赖与间接依赖
直接依赖: 当前项目中通过依赖配置建立的依赖关系;
间接依赖: 被依赖的资源,依赖于别的资源,别的资源都为间接依赖。
直接依赖与间接依赖都是相对概念:
依赖冲突
路径优先原则: 当依赖中出现相同资源时,层级越深,优先级越低(间接<直接);
声明优先原则: 当资源在相同层级被依赖时,配置顺序越靠前覆盖配置顺序靠后的;
特殊优先原则: 当一个pom里配了俩,后面的覆盖前面的;
可选依赖
隐藏自己使用的依赖,对外不透明;
<optional>true</optional>
排除依赖
主动将间接依赖资源断开
示例代码为将依赖资源 web01 中排除 log4j 依赖;
<dependency>
<groupId>com.xuhongduo</groupId>
<artifactId>web01</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖范围
每个 jar 添加成依赖以后都有一个依赖范围可以设定:
1、主程序范围 main
2、测试范围 test
3、是否参与打包
依赖范围有四个可选项:
1、compile
<scope>compile</scope>
在主代码,测试代码,打包范围都可以用;比如用于记录日志的 log4j,在主程序,测试,打包时候都要用到。
若不设置 scope,默认为 compile
2、test
<scope>test</scope>
只用于测试的不参与打包和主程序;比如 junit
3、provided
<scope>provided</scope>
不参与打包,参与主程序和测试,因为打包上去会因为版本冲突而产生错误,比如 servlet-api;
4、runtime
<scope>runtime</scope>
只参与打包,比如jdbc;