Maven的依赖体系

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/limm33/article/details/70212357
一、直接依赖和间接依赖
mane最大的好处就是能够方便的声明第三方的jar包,只需要在pom中进行简单的声明就可以将此jar包依赖到项目中,那什么是直接依赖呢?就是在项目中直接声明的这些依赖:
 
  
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.1.4.RELEASE</version>
</dependency>
间接依赖是由直接依赖间接依赖到项目的那些jar包, 当项目依赖于某一第三方 Jar 包,而这一第三方 Jar 包又给我们间接性的带来了大量的依赖,这种间接性的依赖,不仅浪费了磁盘空间,而且也可能带来潜在的冲突,因此我们需要将这些不需要的依赖从项目中排除,对项目进行一个瘦身,这时我们需要对 Pom 进行优化,再或者,通过间接性依赖获得的Jar包版本过低,而这些低版本的Jar包无法满足我们项目的需求,这时我们也需要将这些低版本的Jar包排除掉:
<dependency>
    <groupId>net.sf.spring-json</groupId>
    <artifactId>spring-json</artifactId>
    <version>1.3.1</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring</artifactId>
        </exclusion>
        <exclusion>
            <groupId>cglib</groupId>
            <artifactId>cglib-full</artifactId>
        </exclusion>
    </exclusions>
</dependency>



二、依赖规则
大家看到直接依赖和间接依赖之后可能会有疑问,由不同的直接依赖产生的同一jar包不同版本的jar包之间的间接依赖怎么进行排除?这就要讲到maven的规则:
(1)第一声明者优先(对于简介依赖)
例如:A项目依赖B、C两个项目,B和C又同时依赖D项目(依赖的D项目版本可能还是不同的),那就按照第一声明者优先的规则,谁先声明就用谁的。

(2)最后声明者优先(对于同一pom中直接依赖的同一jar包的不同版本间)
在pom中声明了同一jar包的不同版本,谁声明在后面就采用谁。
(3)最短路径优先(对于间接依赖)
从名称就可以看出对于间接依赖的jar包,谁的间接依赖的路径短就采用谁的,例如A依赖B,B依赖D,而A依赖C,C依赖E,E依赖F,F依赖D,采用最短的依赖A->B->D的依赖版本。

三、 dependencyManagement与dependencies
Maven已经具备了面向对象的思想,面向对象的三要素就是多态、继承、封装,dependencies与dependencyManagement就涉及到的是继承的思想。
多模块项目中,各个模块一般均需要Junit测试Jar包,因此在父Pom配置文件中,我们可以将这个依赖写入:
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>


此模块的各个子模块就可以直接继承此jar包了。
再想想,有一些依赖,是各个子模块所特有的,如果放在父模块的POM中进行定义,那么所有继承了该父模块的子模块均会存在该依赖,这样的结果是啥,项目中存在大量冗余Jar包,不但浪费了磁盘,而且也不利于管理,所以:
dependencyManagement>
    <!-- 配置项目依赖 -->
    <dependencies>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>
        <dependency>
            <groupId>org.opensymphony.quartz</groupId>
            <artifactId>quartz-all</artifactId>
            <version>${quartz.version}</version>
        </dependency>
        <dependency>
            <groupId>oro</groupId>
            <artifactId>oro</artifactId>
            <version>${oro.version}</version>
        </dependency>
</dependencyManagement>


我们可以这样定义jar包在父模块,这样子模块就不会继承了,如果子模块需要用到jar包就需要重新声明:
<!-- 配置项目依赖 -->
<dependencies>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
    </dependency>
</dependencies>



可以省略版本,这样有利于控制版本,当然也可以自己定义在子模块中版本,这样将采用子模块中的版本。



猜你喜欢

转载自blog.csdn.net/limm33/article/details/70212357