版权声明:本文为博主原创文章,未经博主允许不得转载。 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>
<!-- 配置项目依赖 -->
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
</dependencies>
可以省略版本,这样有利于控制版本,当然也可以自己定义在子模块中版本,这样将采用子模块中的版本。