本篇博客介绍maven中的依赖,这个词并不陌生在学习UML图时4大关系同包括依赖这一项。Maven中的依赖大概也是这个意思,是指项目对jar包的依赖。
这种依赖是通过这个配置完成的,配置完毕后被依赖的jar本就会从本地仓库或私服或中央仓库被下载到项目中。下图为pom.xml的一般结构,其中“jar包引入”就是一个依赖,这个配置可以到 http://mvnrepository.com/中搜索自己想要引用的包,将GAV信息直接copy过来就可以完成引用。
依赖需要注意:
1、 配置依赖中的scope属性有四种选择
test:测试范围,编译和打包不使用该依赖。
compile:编译范围,编译和打包使用,依赖传递。(默认项)
provided:编译和测试有效,生成war包时不会加入,如servlet-api在tomcat中存在
runtime:运行时依赖,编译时不依赖
2、依赖传递冲突问题
解决一:
规则:
层次一样,依赖先引用的传递
层次不一样,依赖最短的传递
M表示模块)
Ma——>b1.0,Mc——>b2.0,Md——>Ma&Mc
如上:模块a依赖b的1.0版本,模块c依赖b的2.0版本,模块d同时依赖模块a和模块c 。如果d的pom中先 写了对模块a(c)的依赖则d就依赖b的1.0(2.0)版本。
示例二:
Ma——>b1.0,Mc——>b2.0,Md——>Ma,Me——>Mc&Md
如上:不论先写c或d的那个依赖,e都依赖于b的2.0版本,因为这个传递路径短。
解决二:
依赖排除:如上的第一个示例,如果不希望d传递依赖b1.0就在d的pom.xml中依赖a的dependency下的中添 加exclusions进行排除。如下图:user-service中依赖user-log和user-dao,在log和dao模块中都用都log4j 这个jar的引用,在log的依赖中添加如下的配置后service就只会使用user-dao中的log4j的jar包了。
依赖继承
当所做的项目比较大时会分为不同的模块,不同模块之间往往会依赖相同的jar包,如果引用的jar包版本不统一就会比较麻烦。Maven中的依赖继承就可以解决这个问题。类似面向对象中子类对父类方法属性的继承。
操作:
首先建立父项目,在eclipse中建立一个maven project,将Packaging的方法选为pom。
建立完毕项目我们只需要改动pom.xml配置文件。在这里可以将所有可能用到的jar包都配置起来,配置的格式如下,以下以一个引用为例:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!—本项目GAV的相关信息 -->
<groupId>com.dmsd</groupId>
<artifactId>dmsd-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- 集中定义依赖版本号 -->
<properties>
<junit.version>4.12</junit.version>
</properties>
<dependencyManagement>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencyManagement>
</project>
公共的父项目建立完毕后就可以建立子项目,同样还是建立maven project,不同的地方是需要配置Parent Project的信息:
项目建立完毕后首先打开子项目pom.xml配置文件看文件头,会发现添加了parent标签,这里配置的就是依赖的父项目的GAV信息,同时在子项目添加引用时如果是父项目中已经有的jar包这本项目中添加时不再需要申明版本,只需要什么groupId和artifactId,统一使用父项目中的版本。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dmsd</groupId>
<artifactId>dmsd-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.dmsd</groupId>
<artifactId>taotao-dmsd</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 添加依赖 -->
<dependencies>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
依赖继承需要注意
1、选择性依赖继承
dependencyManagement>:这个标签在父项目中添加依赖时使用,这样在子项目就不会继承父项目所有的依赖,而是需要在子相面中声明groupid和artifactid然后到父相面中寻找相应的jar包。
小结:
1、Maven使用配置完成项目对jar包的引用,这些依赖可以传递、可以被继承。
2、依赖的传递和依赖的继承在pom.xml中最直观的区别就是在继承中会出现<parent>标签,其中是父项目的信息。传递就是发生在一般的依赖<dependendy>配置中的。