一、实验目标
理解Maven依赖传递方式,掌握Maven依赖管理。
二、实验内容
1、编写三级Maven Projects,命名为Top/Mid/Bot,实现自上而下的依赖,并结合自己的场景阐述直接依赖和间接依赖的相对关系;
2、在Maven中央仓库中检索某个依赖资源的多个版本,分别配置给三级Projects复现依赖资源版本冲突情形,而后结合自己的场景分别解释Maven中路径优先、声明优先、特殊优先的意义;
3、针对三级Projects目录分别设置可选依赖和排除依赖,并结合结果解释二者区别。
三、实验步骤
1.创建项目,编写三级Maven Projects。
-
打开 IntelliJ IDEA,点击 "New Project"。
-
选择 "Maven Archetype"。
-
选择“Archetype”,输入项目信息:
-
Group Id: org
.example
-
Artifact Id:
Top
-
Version:
1.0-SNAPSHOT
-
-
完成项目向导后,右键点击
Top
项目,选择 "New" > "Module"。 -
再次选择 "Maven",输入信息:
-
Artifact Id:
Mid
-
包括 Version:
1.0-SNAPSHOT
-
-
重复该步骤,为
Bot
创建另一个 Maven 模块,Artifact Id 设置为Bot
,parent设置为Mid
。 -
在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>
2.阐述直接依赖和间接依赖的相对关系
-
场景:
Top
是负责业务逻辑的模块,Mid
是处理数据访问的模块,而Bot
则是基础工具和通用函数模块。 -
直接依赖:指的是一个模块直接引用另一个模块的情况。在本例中,
Mid
模块是Top
的直接依赖,Bot
模块是Mid
的直接依赖。在 Top 中调用 Mid 的某些功能,例如获取数据接口。 -
间接依赖:当一个模块依赖于另一个模块,而这个另一个模块又依赖于第三个模块时,第一个模块就间接依赖于第三个模块。比如,在我们这个项目中,
Top
间接依赖Bot
,因为Top
依赖Mid
,而Mid
又依赖Bot
。
3.在Maven中央仓库中检索某个依赖资源的多个版本,分别配置给三级Projects复现依赖资源版本冲突情形
-
选择依赖资源:
log4j
4.解释Maven中路径优先、声明优先、特殊优先的意义
1. 路径优先
在Bot中添加1.2.9版本的log4j
,在Mid中添加1.2.12版本的log4j
-
定义:Maven 会选择依赖树中最接近根项目的依赖版本。
-
应用场景:如果
Mid
中引用的依赖 (例如log4j
) 在Mid
中已被引用,那么Mid
中的直接依赖就会受到影响。 -
示例解读:如果
Mid
中需要log4j
的版本是1.2.12
,而Bot
引用的是1.2.9
,Top
将使用1.2.12
,因为它在路径上更近。 -
展示:
2. 声明优先
在Bot中添加1.2.9版本的log4j
,新建Bot2,添加1.2.12版本的log4j
-
定义:Maven 在遇到路径长度相同的依赖时,会选择 pom.xml 中先声明的版本。
-
应用场景:假如你在
Bot
中显式声明了log4j:1.2.9
,而在Bot2
中声明log4j:1.2.12
,那么Bot
所声明的版本将会被优先选择。 -
示例解读:
Mid
先声明Bot
,再声明Bot2
,则面对路径长度相同的依赖log4j
时,优先选择1.2.9版本 -
展示:
3. 特殊优先
-
定义:当同一个project下有不同版本时,后配置的优先。
-
应用场景:假如你在
Bot
中先声明了log4j:1.2.9
,又声明log4j:1.2.12
,那么 后声明的版本将会被优先选择。 -
展示:
5.设置可选依赖和排除依赖
-
排除依赖:在Top的pom.xml中添加
exclusions
,排除Bot,示例配置如下。<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 的 pom.xml 关于 Bot 的依赖声明中使用 optional 元素,将其设置成可选依赖,示例配置如下。
<dependencies> <dependency> <groupId>org.example</groupId> <artifactId>Bot</artifactId> <version>1.0-SNAPSHOT</version> <optional>true</optional> </dependency> </dependencies>
6.结合结果解释二者区别
-
排除依赖 VS 可选依赖
-
排除依赖是控制当前项目是否使用其直接依赖传递下来的接间依赖;
-
可选依赖是控制当前项目的依赖是否向下传递;
-
可选依赖的优先级高于排除依赖;
-
若对于同一个间接依赖同时使用排除依赖和可选依赖进行设置,那么可选依赖的取值必须为 false,否则排除依赖无法生效;
-
可选依赖运用场景是自己开发的jar包,排除依赖是别人开发的jar包。
-
四、问题总结与体会
在这个实验中,遇到问题如下:
1.对于使用IDEA创建Maven,编写三级目录不太熟悉。
2.对于依赖优先级、排除依赖、可选依赖等概念在上课前没有了解。
以上问题均已解决。
通过这次实验令我收获了很多,对于Maven的理解有了进一步的加深,同时,对于课上所学知识也有了实践。