maven依赖管理-概念笔记

1.依赖添加

通过在pom.xml文件中添加如图的代码,通过groupId和artifactId这两个坐标查找到具体的jar包,进行依赖添加。若报错为红,点击重载即可。

2.依赖传递

依赖具有传递性,我们将直接写在pom.xml文件中的这些被显式声明过的依赖称为 直接依赖。这些直接依赖自身依赖的依赖称之为间接依赖。如spring-context本身依赖了spring-aop和spring-beans等依赖。此时若spring-context被写在pom.xml文件中,则spring-context被称为直接依赖,而spring-aop和spring-beans为间接依赖。倘若在spring-context的依赖声明下,再显式地声明依赖了spring-aop,此时maven并不会为我们下载两份spring-aop.jar 。 因为maven会自动解析这些依赖间的传递关系。

3.依赖冲突

在pom文件中,当我们同时添加spring-jdbc和lombok这两个依赖时,会产生依赖冲突。这是因为Lombok本身就被spring-jdbc间接依赖了,但是spring-jdbc间接依赖的Lombok的版本和直接依赖的Lombok版本不一致。此时就产生了 一个问题:我该依赖哪个版本的jar包呢?

此时就要遵循两个原则:

3.1 最短路径优先

依赖了相同依赖时,最短路径的那个依赖将被优先应用。

如图,spring-jdbc间接依赖了spring-beans、spring-core和spring-tx这三个依赖。但是spring-beans这个依赖也间接依赖了spirng-core这个依赖,此时存在两个spirng-core的依赖添加。然而spring-beans中的spring-core将被忽略,这是因为另一个spring-core和spring-beans为同一层级,换而言之,这个spring-core更靠近根目录,它将会被优先使用。

3.2 先声明优先

这个原则顾名思义,在pom.xml文件中,先被声明的依赖将被优先使用,此处就不再赘述。

3.3 手动解决依赖冲突

此处我们先假设一个情境:

建立一个maven工程,它同时拥有三个子模块A,B,C。在子模块A的pom.xml文件中,我们先后添加了模块B和模块C的依赖。再让我们来到模块B和模块C的pom.xml文件,同时让这两个模块依赖spring-jdbc这个jar包,但是让模块B依赖6.1.11版本,让模块C依赖6.1.10版本。此时产生了依赖冲突,因为编译器不知道此时应该引用哪个版本的spring-jdbc.jar。但是又因为先声明优先原则,在模块A的依赖路径中,模块B先声明,此时模块C中的6.1.10版本的spring-jdbc将被忽略,模块B中的6.1.11版本将被使用。那么如何改变这种原则,让编译器强行使用模块C中的6.1.10版本的依赖呢?

3.3.1 添加<exclusions>标签

使用方法是在模块A的pom.xml文件中对模块B的依赖下添加这一行代码,exclusions意为排除,此时模块B中对  groupId为org.springframework artifactId为spring-jdbc 的jar包的所有版本进行排斥,这个坐标表示的jar包将不被使用。(此时IDEA中模块C的spring-jdbc仍为灰色不被使用,为显示bug,重启即可显示正常)

3.3.2添加<optional>标签

模块B的spring-jdbc依赖下添加<optional>标签,此时模块B的spring-jdbc依赖将不被传递给模块A。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>6.1.11</version>
    <optional>true</optional>
</dependency>

4.依赖继承

对于父工程的pom.xml文件中,添加了JUnit的依赖,那么即使在子模块的pom.xml中没有添加相应的依赖,子模块也能正常使用相应的功能。如果子模块和父模块依赖了相同的jar包,那么子模块优先。如图:

因此,我i们可以说  子模块会无条件继承父模块的所有依赖

因此即使我们给父模块的依赖添加了compile以外的<scope>标签,这些依赖也会被传递给子模块

这种现象我们称之为“依赖聚合”。虽然依赖聚合符合我们对父子工程的直觉认知,但它会造成不必要的依赖膨胀,并引起更多的复杂的依赖冲突。此时我们需要用到<dependencyManagent>标签来规避依赖聚合这种将父模块的所有依赖一股脑全部传递给子模块的行为。

方法也很简单,我们只需要创建<dependencyManagement>的头尾标签,然后将原来的<dependencies>的一整个内容剪切到<dependencyManagement>里面即可。此时倘若需要子模块需要使用父模块的依赖,则需要在子模块自身的pom.xml文件中显式声明该依赖,如果不表明版本<version>,则会自动沿用父模块的<dependencyManagement>中的依赖版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值