Maven的依赖体系

来源:互联网 发布:手机淘宝能删除好评吗? 编辑:程序博客网 时间:2024/06/08 06:00
一、直接依赖和间接依赖
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>



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



1 0
原创粉丝点击