Maven依赖那些事儿

2021-01-18  本文已影响0人  quanCN

依赖的配置

一个依赖声明可以包含如下元素

<project>
...
    <dependencies>
        <dependency>
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <type>...</type>
            <scope>...</scope>
            <optional>...</optional>
            <exclusions>
                <exclusion>
                    ...
                </exclusion>
                ...
            </exclusions>
        </dependency>
        ...
    </dependencies>
...
</project>

根元素的project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个项目可以包含的元素有:

依赖范围

首先需要知道Maven对于编译、测试、运行使用三套不同的classpath,Maven依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系

依赖范围scope 对于编译classpath有效 对于测试classpath有效 对于运行classpath有效 例子
compile Y Y Y spring-core
test - Y - Junit
provided Y Y - servlet-api
runtime - Y Y JDBC驱动实现
system Y Y - 本地的,Maven仓库之外的类库文件

传递性依赖

何为传递性依赖

如下图,假设A模块与B模块的依赖范围都为默认compile,那么C模块就会成为A模块的compile范围依赖,C模块是A模块的一个传递性依赖


有了传递性依赖机制,就不需要考虑一个模块所依赖了什么,也不用担心引用多余的依赖。Maven会解析各个直接依赖的POM,将那些必要的间接依赖以传递性依赖的形式引入到当前的项目中

传递性依赖和依赖范围

依赖范围不仅可以控制依赖与三种classpath的关系,还对传递性依赖产生影响
如下图,A依赖于B并且称为第一依赖,B依赖于C并且称为第二依赖,A对于C是传递性依赖由第一依赖第二依赖的依赖范围决定


如下表所示,左边一列为第一依赖,最上面一行为第二依赖,中间的交叉单元格则表示传递性依赖

第一依赖\第二依赖 compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

依赖调解

当传递性依赖造成问题的时候,我们需要清楚地知道该传递性依赖是从那条依赖路径引入的

Maven依赖调解(Dependency Mediation)共有两条原则


可选依赖-optional

:在理想情况下,是不应该使用可选依赖的。使用可选依赖的原因是某个项目实现了多个特性,在面向对象程序设计中,有个单一职责性原则,意指一个类应该只有一项职责,而不是揉合太多的功能

上一篇 下一篇

猜你喜欢

热点阅读