JavaWeb——Maven(6/8):依赖管理-依赖传递 (介绍、直接依赖与间接依赖、演示、排除依赖)
目录
依赖传递
介绍
直接依赖与间接依赖
演示
排除依赖
依赖传递
介绍
- 依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
本小节以 Logback 为例,来了解 Maven 当中依赖传递的情况。
我们之前在使用 Logback 记录日志的时候,我们在 Java 工程当中引入了三个包,那这里我们怎么就只是引入了 Logback classic 这一个坐标呢?
其实呢,在 Maven 项目当中,我们引入这一个坐标,另外的两个包他也会自动引入进来,如上图,Logback 相关的另外两个依赖也自动的引入了,这就涉及到了 Maven 当中的一个特性,这个特性我们称之为依赖传递。
直接依赖与间接依赖
Maven 当中的依赖是具有传递性的,比如我们来看一下下面这幅图,
在这幅图当中就描述了这三个项目之间的依赖关系。A 项目当中依赖了一个组件资源,还依赖了另外的一个组件,而 B 项目当中还依赖了一个组件,即使我们在 A 项目当中只指定了部分依赖,那在依赖传递当中,我们把当前项目直接通过依赖配置所添加的依赖,我们称之为直接依赖,所以对于 A 项目来说,这个组件以及下面的 B 项目就是它的直接依赖,如果被依赖的资源,它还依赖了其它资源,A 项目也会间接的依赖这些资源,这部分的依赖,我们称之为间接依赖。
演示
简单介绍了依赖传递特性之后,接下来我们直接打开 A 项目,感受一下 Maven 的依赖传递特性。这里准备好了三个项目分别是 A、B、C,直接打开 A 项目的 pom.xml,
在 A 项目当中,我们会看到他依赖了 Logback 的依赖,A 项目当中,还依赖了另外一个项目,也就是说,A 项目依赖 B 项目,只需要通过依赖配置的形式来指定 B 项目的坐标就可以了。
再打开 B 项目的 pom.xml,
在 B 项目当中依赖了 junit 项目,而且还添加了一个C项目依赖,最后进入到C 项目,其当中依赖了一个工具包。
这是这三个工程之间的依赖关系。
那 A 项目当中到底有没有 C 的依赖呢?我们可以直接打开右侧的 Maven 面板直接来找到,
他直接的依赖有两个,一个是 maven-project 的 B,来我们直接打开下面这一项依赖,
可以看到C 传递到了 A,在 C 当中我们刚才看到引入了一个依赖,是工具包,那这个工具包也会传递到 A 项目,这就是 Maven 依赖传递。
可视化
他还给我们提供了一种可视化的查看方式,我们要想查看某一个 Maven 项目的依赖情况,我们只需要打开 pom 文件,在 pom 文件当中我们点击右键,然后选择第二个 “Diagrams”,然后选择 “Show Dependencies”,
这样就会以图表的形式来展示出依赖之间的关系,
此时我们就会清晰的看到,A 直接依赖了 Project 的 B 还有 Logback 的依赖,而 Project 的 B 当中又依赖了 Project 的 C 和一个工具,而 Project 的 C 当中又依赖了 commons。
那此时我们就能够看到,Project 的 A 当中这些依赖他都有,就是因为依赖传递。
排除依赖
- 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本。
- 通过 exclusion 标签来排除依赖
如果 A 依赖了 B,B 又依赖了另外一个资源,A 它是会依赖这个资源的,如果 A 只想依赖 B 项目,它不需要 B 项目依赖的这个资源,我们就可以通过 Maven 当中的排除依赖来解决这个问题。那所谓排除依赖呢,我们可以主动断开依赖的资源,被排除的资源是无需指定版本的,默认会传递到 A,断开依赖的资源,A 就不会依赖这个资源了。
在 A 项目当中,B 项目当中会传递 C ,下来还传递一个 “junit” 这个依赖,那假设我在 A 项目当中我就不想要 “junit” 这个依赖,我就可以将 “junit” 这个依赖排除掉。
“junit” 这个依赖是传递下来的,所以我们就需要在 A 项目当中引入传递 B 项目依赖的时候,在下面来排除依赖,
排除依赖的时候,我们是不需要指定版本的。
这样配置就结束了,一旦 pom 文件发生变化之后,我们需要点击这个重新加载的按钮,来刷新一下,大家注意看,B 当中传递的 “junit” 会不会传递下来,
我们会看到,“junit” 依赖就没有了,那么此时,A 当中虽然依赖了 B,但是 B 所依赖的 “junit” 就没有出现了,这就是排除依赖。
END
学习自:黑马程序员——JavaWeb课程