maven 依赖范围及其对传递依赖的影响

maven 依赖范围及其对传递依赖的影响

基本概念

A依赖B, 需要在A的pom.xml文件中添加B的坐标, 添加坐标时需要指定依赖范围,依赖范围包括:

  1. compile: 编译范围, 指A在编译时依赖B, 此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,
    由于运行时需要所以编译范围的依赖会被打包。
  2. provided: provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用, provided依赖在编译和测试时需要,在运行时不需要, 比如: servlet api被tomcat容器提供。
  3. runtime: runtime依赖在运行和测试系统的时候需要,
    但在编译的时候不需要。比如:jdbc的驱动包。由于运行时需要所以runtime范围的依赖会被打包。
  4. test: test范围依赖在编译和运行时都不需要, 它们只有在测试编译和测试运行阶段可用, 比如:
    junit。由于运行时不需要所以test范围依赖不会被打包。
  5. system: system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径,需要指定systemPath磁盘路径, system依赖不推荐使用。
    在这里插入图片描述

一般情况下

默认引入的jar包------- compile【默认范围可以不写】(编译、测试、运行都有效)
servlet-api 、jsp-api ------- provided (编译、测试有效, 运行时无效防止和tomcat下jar冲突)
jdbc 驱动jar包---- runtime (测试、运行有效)
junit ----- test (测试有效)
依赖范围由强到弱的顺序是: compile>provided>runtime>test

依赖范围对传递依赖的影响

是因为依赖会有依赖范围, 依赖范围对传递依赖也有影响, 例如有A 、B、C,A依赖B、B依赖C, C可能是A的传递依赖, 如下图:
在这里插入图片描述最左边一列为直接依赖, 理解为A依赖B的范围, 最顶层一行为传递依赖, 理解为B依赖C的范围, 行与列的交叉即为A传递依赖C的范围。

举例

比如A对B有compile依赖, B对C有runtime依赖, 那么根据表格所示A对C有runtime依赖。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42794011/article/details/88394813