【Maven由浅入深】6.maven的依赖特性

之前我们做了3个模块,user-core、user-log和user-service,之间展现出了相互依赖的特性。

接下来我们要说依赖中几个比较重要的概念。
有没有发现我们的pom文件的<dependency></dependency>标签对可以设置一个<scope></scope>标签对,然后其中的值有compile、import、provided、runtime、system、test。
system和import我们先不说。说一下compile、provided、runtime和test。

compile:
我们的依赖范围是基于compile的依赖范围,也是我们的默认依赖范围。当<scope></scope>标签对中是compile时,它会在编译或打包的时候把依赖加进去,这就是compile的范围。

provided:
当我们编译、测试的时候会把依赖加进去,但是当我们打包的时候就不会把依赖加进去。(例如我们做Web需要Servlet-api.jar,但是我们的tomcat的lib中是有这个包的,我们最后给项目打包的时候如果把Servlet-api.jar依赖也加进去的话,就会发生冲突。)

runtime:
在运行的时候依赖,在编译的时候不依赖。

test:
在测试范围内依赖有效,在编译和打包的时候不会使用这个依赖。(例如我们使用的测试jar包junit,在项目正式启动后这个包就不需要了,所以我们仅在测试中使用这个依赖,编译和打包的时候就不需要了,即节省了编译压力提高了效率)

注意,如果我们将junit的scope设置成test,我们编译的时候只为test源文件夹下的类提供junit依赖,src下其它文件夹下的类不提供依赖,所以我们要注意,scope为test的依赖只能提供给test文件夹下的类,编写的时候注意使用范围。

我们注意到,我们的user-service模块集成了user-core和user-log两个模块,而且引用了后两者的依赖包,我们要注意,这里集成的依赖包是后两者编译compile范围内的依赖包,而不是所有的依赖包(scope不是默认的或不是compile)。

接来下我们来谈一下依赖里让人比较头疼的一些事。
假设我们有一个A项目,依赖了一个L-1.0.jar,然后我们有一个B项目,依赖了一个L-2.0.jar,然后我们又有一个C项目,及依赖于A,又依赖于B:
A--L1.0
B--L2.0
C--A,B

那么C项目是引用的L-1.0.jar呢,还是引用L-2.0.jar呢?我们来试验一下:

我们的user-core依赖的log4j版本是1.2.17:

我们的user-log依赖的log4j版本是1.2.9:

那集成这两个项目的user-service,使用的log4j是什么版本的?
我们看一下:

为什么?我们看一下user-service的pom文件:
发现我们是先引入的user-log,后引入的user-core:

所以先引入了log4j-1.2.9,然后引入user-core的时候发现已经存在log4j的jar,所以就没有重复引入。
所以ABC之间,A、B和L的依赖是直接依赖,C和L的依赖是间接依赖。当我们有了间接依赖之后,先声明了哪个使用该依赖的模块,就间接使用哪个依赖。

接下来看下一点:
如果级别相同,哪一个先写依赖哪一个,那么我们看一下这个情况:
我们现在将user-log和user-core的依赖先后调换一下:

首先看我们的log4j,使用的就是1.2.17了:

这一点是没有问题的,但是看我们的common-logging版本:

是1.1.1对吧?回来看一下我们user-core和user-log的common-logging版本:

发现user-core的版本是1.0.4,根据我们“哪一个先写依赖哪一个”的规则,应该是引用common-logging-1.0.4才对,但是为什么引用的是user-log的1.1.1呢?

我们打开user-core的pom的依赖级层图:

发现user-core的common-logging是间接依赖,也就是说是dbunit使用的common-logging。

而我们看一下user-log的common-logging的依赖关系:

发现是直接依赖关系。

所以,当依赖级别相同的时候,相同的jar,我们是哪个先被依赖就依赖那个模块的jar,前提是,此jar我们只依赖它“依赖层数”最短的jar。
这就是为什么会使用common-logging的1.1.1版本。

能不能限制某些依赖的使用呢?假设我们就想用common-logging的1.0.4版本,我们可在user-service的pom文件中这样修改:

这样就排除使用user-log的commons-logging包了,我们再看user-service的依赖,发现已经变成1.0.4版本:

所以,当依赖冲突的时候,我们可以通过exclusion排除包来解决依赖的冲突。

转载请注明出处:http://blog.csdn.net/acmman/article/details/50628499

时间: 2024-11-01 21:33:27

【Maven由浅入深】6.maven的依赖特性的相关文章

4.Maven概念模型,maven的生命周期,Maven坐标,依赖管理(依赖范围,依赖声明),仓库管理,私服概念

 1 maven概念模型 2 maven的生命周期,项目构建过程 Maven生命周期就是为了对所有的构建过程进行抽象和统一 包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤   Maven有"三套"相互独立的生命周期,而且相互独立,这三套生命周期分别是: Maven三大生命周期 clean:清理项目的 在进行真正的构建之前进行一些清理工作. default:构建项目的 构建的核心部分,编译,测试,打包,部署等等. site:生成项目站点的 生成项目报告,站点,发布站点

maven dependency:tree 生成的依赖树如何解读的

问题描述 maven dependency:tree 生成的依赖树如何解读的 解决方案 我们先对齐一下概念:1)可以认为每个依赖包都是依赖树中的一个节点 2)当前工程包account-email为根节点 ;3)除了根节点外,其余节点都有一个唯一父节点,和0到n个兄弟节点 +表示当前依赖包节点后面还有兄弟节点 -表示这是其父节点下所有子节点的最后一个了,后面木有了兄弟节点了. 解决方案二: 具体 + 和是什么意思 解决方案三: 仔细观察可以发现, 区别不在于 + 个 - ,而是在于 +- 和 -

maven无法从私服下载依赖

问题描述 我在pom.xml里面配置了<distributionManagement><repository><id>thirdparty</id><url>http://192.168.9.16:8000/nexus/content/repositories/thirdparty</url></repository></distributionManagement>我的目的是想下载依赖的时候,优先去私服下载,

【Maven由浅入深】3.在Eclipse中创建maven工程

紧接着上一篇,下面我们来学习如何在Eclispe(MyEclipse)中创建Maven工程. 如果我们使用的是光秃秃的eclipse(最原始的),那么我们要为eclipse下载一个插件,即是m2eclipse 我使用的是MyEclipse8.5版本,其中已经安装好了Maven插件. 打开我们的MyEclipse,我们点击Windows选项,然后选择Preferences选项,然后我们可以看到里面有一个Maven选项: 这是Myeclipse直接给我们的Maven,这个Maven我们是不能直接使用

国内阿里maven仓库镜像maven配置文件maven仓库速度快

国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用. 最新更新:2016年11月11日 18:05:40 阿里云提供Maven私服,我把配置文件贴一下,自己放在maven的conf下就行,setting.xml https://github.com/ae6623/Zebra/blob/master/maven-repo-settings-ali.xml <?xml version="1.0" encoding="UTF-8&

maven-Eclipse中Maven工程缺少Maven Dependencies

问题描述 Eclipse中Maven工程缺少Maven Dependencies 如图,缺少maven的jar包 导致全部报错 而且我发现这个应该是我频繁的从GIT上拉代码,然后删掉本地,再拉 之后出的这个错误,看了网上的解决方案都没用 解决方案 可以看看这里http://fanli7.net/a/bianchengyuyan/C__/20150225/538504.html 要修改下.classpath文件 解决方案二: Eclipse在引入Maven工程后,找不到Maven Dependen

【Maven由浅入深】1.maven初体验

Maven是目前用的最多的一个项目管理工具,它是Apache的一个开源工具. 下载最新的Maven组件可以到Apache的Maven官网下载:maven.apache.org.左侧找到Download选项下载最新的Maven包. 第一步,我们先下载Maven和配置环境变量 我们下载apache-maven-3.3.1-bin.zip这个版本,下载之后发现只有7.79M 如何安装呢?很简单,我们将安装目录设在D盘下,先把apache-maven-3.3.1-bin.zip压缩包拷贝到D盘下,然后解

【Maven由浅入深】2.maven安装的注意事项

这次主要讲解了 (1)安装本地仓库 (2)找到网络中央仓库的路径 (3)archetype骨架生成器 上次我们安装了Maven,并且创建并编译了一个简单的额项目.我们了解了,Maven工程依赖的所有jar包以及插件文件都放置在仓库中,而这个仓库默认为C:/盘下的用户"文档"文件夹内. 使用默认的仓库配置并不是最佳选择,因为我们的仓库放置在C盘,随着工程的丰富,我们的仓库将会越来越大,C盘一般是系统盘,会占用我们的系统资源,再者,我们重装系统的时候,会将仓库清理掉,所以,我们还是自己修改

【Maven由浅入深】5.在Eclipse中建立简单的项目2

我们上次写了一个user-core模块,管理用户信息的,这次我们写另外一个模块(日志模块),为以后的Maven耦合做准备. 我们创建日志模块的工程,依然创建Maven项目(user-log): 我们要使用common logging来写日志信息,所以我们在pom中添加这个依赖: <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId&