文章目录

  • 1、传递依赖机制
  • 2、传递性依赖和依赖范围
  • 传递性依赖
  • 传递性依赖范围
  • 3、依赖调解
  • 第一原则(最短路径原则)
  • 第二原则(第一声明者优先)
  • 4、可选依赖
  • 5、排除依赖
  • 6、归类依赖
  • 7、优化依赖
  • 小结


当你感觉很难的时候,其实你在走上坡路,当你觉得很容易的时候,就是在走下坡路。

1、传递依赖机制

何为传递依赖机制?

假设我们有一个Spring Framwork 的项目,我们如果不使用maven的话,需要手动去下载相关的依赖。而且Spring Framework 又会依赖于其他开源类库,因此我们需要下载很多jar包。而且大多数情况我们是根据报错信息,一个个去找,很麻烦对不对?很麻烦。

于是有了maven的依赖传递机制,这个时候我们使用Spring Framework的时候就不需要考虑它依赖什么了,也不用一个个手动去找相关的jar包了。maven就会去自动帮我们解析当前依赖需要那些间接依赖,自动帮我们下载。以传递性依赖的形式引入到当前的项目中。画个图:

maven 依赖不向下传递 maven依赖传递原理_ide

2、传递性依赖和依赖范围

传递性依赖

传递性依赖上面已经讲过了,但是我们应该清楚它的术语,分为直接依赖和间接依赖。理解起来很简单,项目的直接声明的依赖就是直接依赖,项目声明依赖的使用到的依赖就是间接依赖。

传递性依赖范围

看清楚,是传递性依赖的范围。不仅仅是依赖的范围,但是与依赖的范围相同的是也是< scope > 来管理的,但是传递性依赖范围,是直接依赖和间接依赖共同决定的。
贴个表: (依赖范围影响传递性依赖)

取值

compile

test

provided

runtime

compile

compile



runtime

test

test



test

provided

provided


provided

provided

runtime

runtime



runtime

最左边一列表示第一直接依赖范围,最上面一行表示第二直接依赖范围。中间交叉单元格则表示传递性依赖范围。

3、依赖调解

在我们实际开发中,我们会定义很多依赖,依赖之间又有着很复杂的关系。所以maven为我们提供了依赖调解机制。主要表现为两个原则:第一原则(最短路径原则)、第二原则(第一声明者优先)。

第一原则(最短路径原则)

假设存在这样两种情况:

maven 依赖不向下传递 maven依赖传递原理_maven 依赖不向下传递_02

maven 依赖不向下传递 maven依赖传递原理_maven 依赖不向下传递_03


因为存在第一原则(最短路径原则),我们的项目会导入第二种情况的X依赖。

第二原则(第一声明者优先)

第二原则是在第一原则的基础上的,在路径长度一致的情况下,最先声明的依赖会被解析使用。

4、可选依赖

通过< optional >标签可以让我们定义的依赖变成可选的依赖。
例如:

<dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>8.0.13</version>
       <optional>true</optional>
    </dependency>
    <!--这里是指举例看一下,实际orcal的驱动包不是开源的-->
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.3</version>
        <optional>true</optional>
 </dependency>

我们在项目汇总定义了两种JDBC连接驱动,这样别人在引用我们的项目的时候就可以根据实际情况导入自己需要的一种驱动。也简化的依赖的管理。当然我们在理想状态下,是不建议这样做的,在面向对象设计中,有个单一责任原则,意指一个类应该只有一项职责,而不是糅合太多的功能,这样的原则在规划Maven项目的时候也同样适用。

5、排除依赖

我们可以通过< exclusions > 、< exclusion >标签进行依赖的排除。适用于我们的依赖冲突的解决、或者不希望存在不稳定因素的依赖。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.13</version>
     <optional>true</optional>
     <exclusions>
        <exclusion>
          <groupId>com.google.protobuf</groupId>
             <artifactId>protobuf-java</artifactId>
          </exclusion>
       </exclusions>
    </dependency>

这里不需要声明版本号,因此传递过来依赖,版本号已经是固定的了。

6、归类依赖

归类依赖具体操作就是,将版本号提取出来,通过< properties >来声明依赖版本号(类似于定义一个变量),然后通过${…}来将变量值取出来。
举例:

<properties> 
<mysqlJdbc>8.0.13</mysqlJdbc> 
</properties>
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>${mysqlJdbc}</version>
</dependency>

这样管理有一个好处,比如我们在使用Spring-Framework各个模块的时候。可以将版本号提取出来,我们想要升级依赖的版本的时候,我们可以通过只改动一个地方,就可以进行版本升级了。

7、优化依赖

优化依赖讲三个命令。可以帮助我们来分析优化依赖。出去掉无用多余的依赖。

mvn dependency:list  查看已解析依赖的列表
mvn dependency:tree  查看已解析依赖的树
mvn dependency:analyze 查看分析依赖。

Used undeclared dependencies 指的是项目中使用到的,但是没有显示声明的依赖。
Unused declared dependencies,意指项目中未使用的,但是显示声明的依赖。理应删除此依赖。

小结

学以致用。