Maven入门-4.Maven的依赖
1.1 添加依赖
1.2 依赖范围(sope)
依赖范围与classpath的关系
1.3 依赖的传递性
1.2.1 依赖传递性的冲突问题
1. 第一种情况
2. 第二种情况
1.2.2 通过exclusions元素排除不想要的传递性依赖
1.2.3 依赖传递性冲突问题解决办法总结
1.4 依赖版本的界限
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:git@github.com: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 依赖传递性冲突问题解决办法总结
- 通过调整dependency的顺序来解决:哪个依赖的顺序在前面就依赖哪个
- 自己添加一个dependeny来解决:因为该路径是最小的。
- 通过exclusions元素排除不想要的传递性依赖
1.4 依赖版本的界限
在依赖某个项目的时候,你可以不必指定特定的某个版本。也可以指定一个版本范围
(,) 不包含
[,] 包含
例如:依赖一个Junit的大于等于3.8 但是小于4.0 的版本
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>[3.8,4.0)</version></dependency>
Maven入门-4.Maven的依赖的更多相关文章
- Maven入门-5.Maven的聚合和继承
1.Maven的聚合1.1 聚合的配置2.Maven的继承2.1 可被继承的POM元素2.2 POM中使用继承2.3 继承dependency 1.Maven的聚合 在Maven入门-4.Maven的 ...
- maven入门-- part4 坐标和依赖
Maven的坐标为各种构件引入了秩序,任何一个构件都必须明确的定义自己的坐标,maven的坐标包括如下的元素: groupId: 定义当前Maven项目隶属的实际项目 artifactId: 该元素定 ...
- Maven入门,Maven项目的创建,nexus 2.x搭建私服以及Maven多模块项目创建
maven的了解做一个总结,以便日后查阅, 若有不足之处,还望指出,学无止境 当然也能起到入门效果. 一,搭建maven私服 1.工具 a. Nexus 2.5.1-01 b. Maven 3.3.9 ...
- Maven 入门——认识 Maven
Maven /ˈmāvən/ ,可以翻译成"专家",是一款来自 Apache 组织的开源项目,用于项目管理.主要服务于基于 Java 平台的项目构建.依赖管理和项目信息管理. 构建 ...
- Maven入门-2.Maven一些核心概念介绍
1.Maven仓库2.Maven坐标3.Maven插件和目标4.Maven生命周期4.1 clean:清理项目4.2 default:构建项目(重要)4.3 site:建立项目站点 1.Maven仓库 ...
- Maven入门:Maven的基本概念
本文转自:http://www.tianmaying.com/tutorial/maven-basic 看这篇文章之前,你应该先Run起来一个简单的Maven项目,先有个感性认识,然后再来听听对这些基 ...
- Maven 入门——认识Maven结构
1.settings.xml 元素解读 localRepository 该元素表示本地 Maven 仓库的地址,不设置的话,默认为 ~/.m2/repository pluginGroups 将插件的 ...
- maven 入门
Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这 ...
- Maven 入门指南
为什么要用 Maven? Maven 主要帮助用户完成以下 3 个方面的工作: 生命周期管理,便捷的构建过程: 依赖管理,方便引入所需依赖 Jar 包: 仓库管理,提供统一管理所有 Jar 包的工具: ...
随机推荐
- CSS排序工具csscomb
一. css写久了以后感觉需要按照某种规则或者说顺序来,便于开发和维护.O(∩_∩)O哈哈~ 找到一个 http://csscomb.com/ CSS排序总结: 1. 对css样式排序; 2. 按样式 ...
- iOS越狱包 分类: ios相关 app相关 2015-06-10 10:53 152人阅读 评论(0) 收藏
编译完了的程序是xxx.app文件夹,我们需要制作成ipa安装包,方便安装 找一个不大于500*500的png图片(程序icon图标即可),改名为:iTunesArtwork,注意不能有后缀名. 建立 ...
- HTML CSS基础(二)
块元素和行内元素 HTML元素根据表现形式,可以分为2类: (1)块元素(block): (2)行内元素(inline): 任何HTML元素都属于这两类中的其中一类. 2.块元素特点: (1)独占一行 ...
- thinkPHP的学习
1.版本,以3.1为主,因为手册是基于这个的,最新的版本,还没有对应的手册 2.发现一个问题,echo 中文时,出现乱码,而调用模版则正常. 3.写url的注意大小写.index和Index是不同的 ...
- Android 控件布局常用属性
<!--单个控件经常用到android:id —— 为控件指定相应的IDandroid:text —— 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串a ...
- javascript中的元素包含判断
在实际开发中,很多时候需要知道某个节点是不是另一个节点的后代.很多浏览器提供了contains方法,如: console.log(document.documentElement.contains(d ...
- apue chapter 4 文件和目录
1.文件信息结构体 struct stat{ mode_t st_mode; //file type and permissions ino_t st_ino; //i-node number (se ...
- IOS设计模式--代理 (委托)
原文 http://blog.csdn.net/lovefqing/article/details/8270111 委托(delegate)也叫代理是iOS开发中常用的设计模式.我们借助于protoc ...
- 1.2.Core Data 的适用场合(Core Data 应用程序实践指南)
如果应用程序要保存的设置数据太多,以致NSUserDefaults及“属性列表“(property list)这种简单的存储方案无法应付.不需要再"重新发明轮子"(reinvent ...
- 二叉树最大路径和-Binary Tree Maximum Path Sum
Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequence ...