实验二Maven依赖管理
实验目的
理解Maven依赖传递方式,掌握Maven依赖管理。
实验内容
-
编写三级Maven Projects,命名为Top/Mid/Bot,实现自上而下的依赖,并结合自己的场景阐述直接依赖和间接依赖的相对关系。
-
在Maven中央仓库中检索某个依赖资源的多个版本,分别配置给三级Projects复现依赖资源版本冲突情形,而后结合自己的场景分别解释Maven中路径优先、声明优先、特殊优先的意义。
-
针对三级Projects目录分别设置可选依赖和排除依赖,并结合结果解释二者区别。
实验步骤
1、创建三级maven项目
我们首先创建maven项目,命名Top。选择信息如下:
点击Top项目添加maven模块,命名为Mid,选择信息如下:
重复上述步骤为Mid添加模块Bot,选择信息同上。最后在Top的pom.xml中添加Mid的依赖,代码如下:
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>Mid</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
在Mid的pom.xml中添加Bot的依赖
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>Bot</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
至此,三级maven项目创建完成。
2、阐述直接依赖和间接依赖的相对关系
- 直接依赖:一个项目直接在其
pom.xml
文件中声明的依赖。在上面的例子中,Mid项目直接依赖于Bot项目。 - 间接依赖:一个项目通过其直接依赖的项目间接地依赖于另一个项目。在上面的例子中,由于Mid项目依赖于Bot项目,而Top项目依赖于Mid项目,因此Top项目间接地依赖于Bot项目。然而,在标准的Maven多模块项目中,通常不会在父POM中声明对子模块的依赖(如Top对Mid的依赖示例所示),因为这些依赖是通过模块继承关系隐式地解决的。
3.在Maven中央仓库中检索某个依赖资源的多个版本,分别配置给三级Projects复现依赖资源版本冲突情形,而后结合自己的场景分别解释Maven中路径优先、声明优先、特殊优先的意义;
检索依赖资源Spring Core
-
路径优先
定义:在Maven中,最短路径优先原则指的是当解决项目依赖关系时,Maven会尽量选择最短路径来满足这些依赖关系。这意味着当有多个不同版本的依赖项可供选择时,Maven会选择路径最短的那个版本。
实例场景:我们在Mid引用spring-core版本为6.1.13,在Bot引用的版本为6.1.9,如下
则Top会引用的依赖版本为6.1.13,因为他在路径上最近,如下:
-
声明优先
定义:不同于以往其他后引入覆盖先引入的情况,在maven依赖中而是先引入覆盖后引入,先引入的依赖具有优先权,不会被后引入的相同依赖所覆盖,这就是声明顺序优先原则。
实例场景:我们首先在Mid声明Bot_2,在Bot引用spring-core版本为6.1.13,在Bot_2引用6.1.9。Mid 先声明Bot,再声明Bot_2,则面对路径长度相同的依赖spring-core时,优先选择6.1.13版本。
-
特殊优先
定义:当一个项目引用多个不同版本的依赖时,后配置的优先。
场景实例:在Bot引用spring-core,先引用6.1.13版本,再引用6.1.9版本,最终显示Bot引用6.1.9版本的依赖。
4、设置可选依赖和排除依赖
-
排除依赖:在Top中排除Bot,使用exclusions模块,代码如下:
<dependencies> <dependency> <groupId>org.example</groupId> <artifactId>Mid</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>org.example</groupId> <artifactId>Bot</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
-
可选依赖:在Mid声明关于Bot的生命中添加optional模块,将其设置成可选依赖。代码如下:
<dependencies> <dependency> <groupId>org.example</groupId> <artifactId>Bot</artifactId> <version>1.0-SNAPSHOT</version> <optional>true</optional> </dependency> </dependencies>
-
二者的区别
直接区别:排除依赖是控制当前项目是否使用其直接依赖传递下来的接间依赖,可选依赖是控制当前项目的依赖是否向下传递。
依赖的传递性:
- 可选依赖不具有传递性,当其他项目依赖于包含可选依赖的模块时,这些可选依赖不会自动传递给它们。
- 排除依赖则会影响传递性依赖项的引入,确保在构建过程中不会包含被排除的依赖项。
使用场景:
- 可选依赖一般用于自己开发,自己不希望其依赖被其他项目自动发现和使用时,可以使用可选依赖。
- 排除依赖一般用于调用者(即依赖项使用者),当调用者不希望使用某个依赖项或某个版本的依赖项时,可以使用排除依赖。
优先级:可选依赖的优先级高于排除依赖,即对于同一个依赖使用了可选依赖和排除依赖,则优先可选依赖。
实验总结体会
- 本次实验第一次建立了去建立三级maven项目,在建立项目的同时我还去查询了建立maven项目时选择的信息的意思,例如建立maven项目时选择archetype是选择模板原型的意思,通常选择1、cocoon-22-archetype-webapp2、maven-archetype-quickstart3、maven-archetype-webapp。
- 学会去中央仓库查询依赖,和选择不同版本的依赖。
- 遇到问题可以去网上或者社区贴吧寻找答案,增强了我自主解决问题的能力。