Maven的依赖

1、Maven的依赖

Maven的依赖通过dependencis元素来配置依赖,这是Maven最强大的特性之一。它支持传递性依赖。

1.1 添加依赖

在Maven中需要使用在dependencies中定义一个或者多个dependency元素,来声明项目的一个或者多个依赖。 
每个依赖元素dependency包括: 
 
例如:为项目添加junit测试的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/maven-v4_0_0.xsd " >      <modelVersion>4.0.0</modelVersion>      <groupId>com.fz</groupId>      <artifactId>ShiroTest</artifactId>      <packaging>war</packaging>      <version>0.0.1-SNAPSHOT</version>      <name>ShiroTest Maven Webapp</name>      <url> http://maven.apache.org </url>      <dependencies>          <dependency>              <groupId>junit</groupId>              <artifactId>junit</artifactId>              <version>4.11</version>              <!--不声明依赖范围scope,默认是compile-->              <scope>test</scope>          </dependency>      </dependencies> </project>

1.2 依赖范围(sope)

<dependency>    <!--     compile(默认):编译范围的依赖,它在编译和打包的时候都会把该依赖打包进去    test:测试依赖范围,它在编译和打包的时候都不会把该依赖打包进去    provided:在编译和测试范围有效,最后生成war包时不会打包进去。    runtime:运行时依赖,编译的时候不依赖。    system:系统依赖范围    import:导入依赖范围     -->    <scope></scope></dependency>

依赖范围与classpath的关系

依赖范围Scope 对于编译classpath有效 对于测试classpath有效 对于运行时classpath有效 例子
compile Y Y Y spring-core
test Y JUnit
provided Y Y servlet-api
runtime Y Y JDBC驱动实现
system Y Y 本地的,Maven仓库之外的类库文件

1.3 依赖的传递性

在Maven中一个依赖不仅仅是一个JAR。它是一个POM文件,这个POM可能也声明了对其它构件的依赖。这些依赖的依赖叫做传递性依赖 
所谓传递性依赖就是: 如果项目A依赖于项目B,项目B自身依赖于项目C,那么项目A它也依赖于项目C的依赖。 
这种依赖是基于compile这个范围进行依赖 
假如你的项目中需要依赖一个A库,这个A库自身又依赖了3个其它库。当你在dependencies中配置了A库的依赖的时候,则Maven会自动依赖3个其他库。不用你再自己去依赖了。就像Spring和Hibernate一样。你配置的时候,只需要配置Spring和Hibernate即可。 
Maven在下载相应依赖的jar的时候,还会下载该jar的pom文件。这个文件对于传递性依赖特别重要。 
这个pom文件跟我们现在编写的pom.xml文件没太大区别,打开后其实也是一样。 
如下是hibernate-core-4.3.10.Final.jar的pom文件(hibernate-core-4.3.10.Final.pom)

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  <modelVersion>4.0.0</modelVersion>  <groupId>org.hibernate</groupId>  <artifactId>hibernate-core</artifactId>  <version>4.3.10.Final</version>  <dependencies>    <dependency>      <groupId>org.jboss.logging</groupId>      <artifactId>jboss-logging</artifactId>      <version>3.1.3.GA</version>      <scope>compile</scope>    </dependency>    <dependency>      <groupId>org.jboss.logging</groupId>      <artifactId>jboss-logging-annotations</artifactId>      <version>1.2.0.Beta1</version>      <scope>compile</scope>    </dependency>    <dependency>      <groupId>org.jboss.spec.javax.transaction</groupId>      <artifactId>jboss-transaction-api_1.2_spec</artifactId>      <version>1.0.0.Final</version>      <scope>compile</scope>    </dependency>    <dependency>      <groupId>dom4j</groupId>      <artifactId>dom4j</artifactId>      <version>1.6.1</version>      <scope>compile</scope>    </dependency>    <!-----------省略部分----------->  </dependencies>  <name>Core Hibernate O/RM functionality</name>  <description>The core O/RM functionality as provided by Hibernate</description>  <url>http://hibernate.org</url>  <organization>    <name>Hibernate.org</name>    <url>http://hibernate.org</url>  </organization>  <issueManagement>    <system>jira</system>    <url>https://hibernate.atlassian.net/browse/HHH</url>  </issueManagement>  <scm>    <url>http://github.com/hibernate/hibernate-orm</url>    <connection>scm:git:http://github.com/hibernate/hibernate-orm.git</connection>    <developerConnection>scm:git:[email protected]:hibernate/hibernate-orm.git</developerConnection>  </scm>  <licenses>    <license>      <name>GNU Lesser General Public License</name>      <url>http://www.gnu.org/licenses/lgpl-2.1.html</url>      <comments>See discussion at http://hibernate.org/license for more details.</comments>      <distribution>repo</distribution>    </license>  </licenses>  <developers>    <developer>      <id>hibernate-team</id>      <name>The Hibernate Development Team</name>      <organization>Hibernate.org</organization>      <organizationUrl>http://hibernate.org</organizationUrl>    </developer>  </developers></project>

可以看到hibernate-core-4.3.10.Final.pom文件中已经定义了hibernate-core-4.3.10.jar自己所依赖的jar包了。

1.2.1 依赖传递性的冲突问题

1. 第一种情况

 
项目A依赖于项目B1.0 ,项目C依赖于项目B1.1。项目D同时依赖于项目A和C,那么哪一个写在前面就先依赖哪个版本。 
也就是说到底依赖于log4j1.2.17还是log4j1.2.16,决定于它的dependency出现的先后顺序。 
哪个依赖的顺序在前面就依赖哪个 
可见上面user-core在user-log前面,而user-core的log4j是1.2.17。那么最终user-dao的log4j就是1.2.17版本 
同理,如果换个位置。user-log在user-core的前面。

<dependencies> <dependency>        <groupId>com.fz.user</groupId>        <artifactId>user-log</artifactId>        <version>0.0.1-SNAPSHOT</version>    </dependency>    <dependency>        <groupId>com.fz.user</groupId>        <artifactId>user-core</artifactId>        <version>0.0.1-SNAPSHOT</version>    </dependency></dependencies>

那么结果就是 

2. 第二种情况

 
如果路径的长短不一致,就选择最小路径 
user-dao中的log4j路径:user-dao=====>user-core=====>log4j1.2.17 
user-log中的log4j路径:user-log=====>log4j1.2.16 
可见user-log的log4j路径要短一些,所以这里是1.2.16 
 
如果这里把user-log换成user-core的话,那么user-core的log4j路径也是比user-dao的路径短。结果肯定是log4j1.2.17 

假如我不想依赖user-core和user-log两个模块中的log4j呢? 
那就自己再添加一个dependency试试。 
 
可以看出Maven会优先依赖自己定义的那个dependeny

1.2.2 通过exclusions元素排除不想要的传递性依赖

以上的问题可以通过更改相应的顺序来确定依赖的版本,当然也可以使用依赖的排除功能。来精确的控制所使用的版本。 
排除依赖:就是将该模块中的**jar包给移除掉。 
例如:以下的情况肯定是使用了user-log的log4j版本,因为它的顺序在前面。假如现在不想通过调整顺序来改版本那就可以使用排除依赖。 
 
排除依赖是在dependency元素下的exclusions元素,例如:我们把user-log中的log4j排除掉,那就只能去user-core中找log4j了 
 
可以看出虽然user-log写在了上面,但是通过exclusion还是会把该模块中的log4j给排除掉。

1.2.3 依赖传递性冲突问题解决办法总结

  1. 通过调整dependency的顺序来解决:哪个依赖的顺序在前面就依赖哪个
  2. 自己添加一个dependeny来解决:因为该路径是最小的。
  3. 通过exclusions元素排除不想要的传递性依赖

1.4 依赖版本的界限

在依赖某个项目的时候,你可以不必指定特定的某个版本。也可以指定一个版本范围 
(,) 不包含 
[,] 包含 
例如:依赖一个Junit的大于等于3.8 但是小于4.0 的版本

<dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>[3.8,4.0)</version></dependency>
时间: 2024-10-12 21:02:23

Maven的依赖的相关文章

maven可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)

我们知道,maven的依赖关系是有传递性的.如:A-->B,B-->C.但有时候,项目A可能不是必需依赖C,因此需要在项目A中排除对A的依赖.在maven的依赖管理中,有两种方式可以对依赖关系进行,分别是可选依赖(Optional Dependencies)以及依赖排除(Dependency Exclusions). 一.可选依赖 当一个项目A依赖另一个项目B时,项目A可能很少一部分功能用到了项目B,此时就可以在A中配置对B的可选依赖.举例来说,一个类似hibernate的项目,它支持对mys

创建第二个 maven (依赖的使用)(注:这篇博文与上一篇博文内容关系密切)

1.第二个工程的创建: a.它的目录层次结构为下图所示: 注:第二个 maven 工程和第一个maven 工程保存的目录一样,和 .metadata同在一个目录下. b.pom.xml文件 以及 HelloFriend.java 和 HelloFriendTest.java 文件填写的内容为: <?xml version="1.0" ?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns

eclipse libraries 不存在maven的依赖包

eclipse libraries 不存在maven的依赖包时,照着下面一步步来 1.项目右键->Build Path -> Java Build Path ->Libraries ->Add Library ->Maven Managed Dependences->点击Next ->点击'Maven Project settings' , 在'Active Maven Profiles (comma separated)'中添加"Maven Depen

Maven传递依赖的时候,同名包不同版本的包均会下载,但是编译的时候,只会加载一个高版本的。

描述,在一个Maven项目中,同时依赖了spring-tomcat-weaver  和  struts-core 包,但是spring-tomcat-weaver 需要commons-digester-1.2 struts-core 需要commons-digester-1.8 Pom文件如下: <dependencies> <dependency> <!-- 需要commons-digester-1.2包 --> <groupId>org.springfr

eclipse插件Maven添加依赖查询无结果的解决方法(Select Dependency doesn&#39;t work)

在eclipse中用过maven的可能都遇到过这种情况,我以前一直在search.maven里面搜索,然后添加pom信息. 今天在网上搜索时,找到了一个解决方法,在这里分享一下. 第一步,在preferences里面选择maven,选中"Download repository index updates on startup" 第二步,打开Maven仓库 第三步,在全局仓库上右键选择"Full Index Enabled" 选择之后,maven会下载一个近百兆的索引

[转]使用Maven添加依赖项时(Add Dependency)时,没有提示项目可用,并且在Console中,输出: Unable to update index for central|http://repo1.maven.org/maven2 。

使用Maven添加依赖项时(Add Dependency)时,没有提示项目可用,并且在Console中,输出: Unable to update index for central|http://repo1.maven.org/maven2 . 解决方式如下: 1.通过其它方式下载如下两个文件: http://repo1.maven.org/maven2/.index/nexus-maven-repository-index.properties http://repo1.maven.org/m

Maven之——依赖与插件管理

Maven之--依赖与插件管理 1.    依赖管理 并不是父POM中配置的所有依赖在不同的子类中都能用到.或者用到了但是不是统一版本.为解决这个.在父POM标签中定义依赖信息.在子POM中加入依赖的引入.具体细节如下:在父POM中配置项目中使用到的依赖.但是不再是dependency标签中配置.因为此标签可以自动被继承.使用dependencyManagement标签.此标签中定义的dependency不会被子POM自动引入.必须在子类中使用dependency声明.可能有些时候会觉得直接在子

Idea maven tomcat 配置热更新 以及 maven jar依赖

看了视频 实在忍不住上了idea的贼船 不过这玩意确实有点坑爹,因为用的人少,所以很多配置是有问题的 例如maven配置tomcat热更新 以及tomcat的maven配置 我这里放几张图作为备用 配置maven web项目跟tomcat的时候一定要选这个按钮进去 然后把一些maven的依赖,全部添加到tomcat,否则tomcat会找不到jar包,然后在web运行的时候报错,启动的时候是不会出现错误的 我这里已经把maven依赖添加进去了,所以不会有问题,右侧已经没有elements这个列表选

linux下安装SVN和MAVEN,并依赖MAVEN环境打包MAVEN项目

一.前提条件 系统环境为: [[email protected] application]# cat /etc/redhat-release CentOS release 6.7 (Final) [[email protected] application]# uname -r 2.6.32-573.el6.x86_64 需要准备的安装包为: subversion-1.6.1.tar.gz subversion-deps-1.6.1.tar.gz apache-maven-3.3.3-bin.t

Maven 实现依赖框架jar包的版本管理

1.版本统一管理 要实现jar的版本统一管理需要对jar的版本进行设置即<version></version>,如下是一段版本控制的以来配置: <dependencies> ................. <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>${o