本篇博客介绍maven中的依赖,这个词并不陌生在学习UML图时4大关系同包括依赖这一项。Maven中的依赖大概也是这个意思,是指项目对jar包的依赖。
       这种依赖是通过这个配置完成的,配置完毕后被依赖的jar本就会从本地仓库或私服或中央仓库被下载到项目中。下图为pom.xml的一般结构,其中“jar包引入”就是一个依赖,这个配置可以到 http://mvnrepository.com/中搜索自己想要引用的包,将GAV信息直接copy过来就可以完成引用。

 


service依赖api 找的是maven仓库中的jar maven依赖是什么意思_jar包



依赖需要注意


       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包了。

service依赖api 找的是maven仓库中的jar maven依赖是什么意思_jar包_02



依赖继承

         当所做的项目比较大时会分为不同的模块,不同模块之间往往会依赖相同的jar包,如果引用的jar包版本不统一就会比较麻烦。Maven中的依赖继承就可以解决这个问题。类似面向对象中子类对父类方法属性的继承。



操作:

       首先建立父项目,在eclipse中建立一个maven project,将Packaging的方法选为pom。


 

service依赖api 找的是maven仓库中的jar maven依赖是什么意思_maven的依赖继承_03

       建立完毕项目我们只需要改动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的信息:


 

service依赖api 找的是maven仓库中的jar maven依赖是什么意思_maven_04

       项目建立完毕后首先打开子项目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>配置中的。