- 浏览: 767985 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (651)
- Java (39)
- Java 初学者小问题 (66)
- 设计模式 (7)
- 项目管理 (3)
- 数据库 (1)
- 算法 (2)
- Java practices (6)
- Effective Java2读书笔记 (78)
- Linux (2)
- programming ruby 读书笔记 (5)
- Core Java Ninth Edition Volume I 读书笔记 (15)
- Pro Git 读书笔记 (12)
- Git (3)
- Maven in Action 读书笔记 (20)
- Web (12)
- 非技术类书籍 (11)
- 电影 (40)
- Web Cache (1)
- jquery (0)
- 历史 (4)
- Dive Into HTML5 读书笔记 (13)
- 三国演义小学毕业考 (79)
- 高效能人士的7个习惯 读书笔记 (12)
- Java Performance 读书笔记 (3)
- Protocol Buffer 学习笔记 (6)
- Mongo DB 学习笔记 (7)
- Morphia 学习笔记 (7)
- Algorithms -- Princeton 学习笔记 (13)
- String研究 (10)
- Hadoop: The Definitive Guide 读书笔记 (3)
- Java与模式读书笔记 (5)
- Date研究 (3)
- The Roman Empire 听课笔记 (4)
- Algorithms -- Standford 学习笔记 (16)
- Core Java Ninth Edition Volume II 读书笔记 (9)
- Thinking in Java 4th Edition 读书笔记 (21)
- Node : Up and Running 学习笔记 (5)
- Eloquent Javascript (8)
- Smashing Node.js 读书笔记 (1)
- Algorithms II -- Standford 学习笔记 (19)
- Algorithm II -- Princeton 学习笔记 (14)
- 网络安全 (2)
- Javascript (4)
- 正则表达式 (1)
- JAVA 7/8 (15)
- JVM (10)
- NodeJS (1)
- 鸟哥的linux私房菜读书笔记 (14)
- Web Service (1)
- The art of programming (9)
- Introduction to Algorithm 读书笔记 (4)
- Java 源码阅读 (0)
- Spring in Action 读书笔记 (2)
- Java Network Programming 读书笔记 (2)
最新评论
-
心存高远:
谢谢作者分享,刚好看到这里不太明白,现在茅塞顿开。不过runt ...
关于 Maven的传递依赖的理解 -
sxlkk:
851228082 写道甚至在某次技术会议现场遇到《Maven ...
关于 Maven的传递依赖的理解 -
851228082:
851228082 写道a----compile----b-- ...
第五章 坐标和依赖 -
851228082:
a----compile----b-----provided- ...
第五章 坐标和依赖 -
851228082:
甚至在某次技术会议现场遇到《Maven in action》的 ...
关于 Maven的传递依赖的理解
今天又回顾了一下 《Maven in Action》的读书笔记第五章 : http://seanzhou.iteye.com/admin/blogs/1290558。再次看到这张Maven 传递依赖的表格:
假设 A 依赖 B , B 依赖 C ,我们称 A 对 B 是第一直接依赖, B 对 C 是第二直接依赖, A 对 C 是传递依赖。下表显示了三者的关系:
第一 第二 |
compile |
test |
provided |
runtime |
compile |
compile |
- |
- |
runtime |
test |
test |
- |
- |
test |
provided |
provided |
- |
provided |
provided |
runtime |
runtime |
- |
- |
runtime |
当时就对这张表格有点一知半解,向同事和老鸟请教,大都无法对其进行解释,甚至在某次技术会议现场遇到《Maven in action》的作者Juven,向其讨教,他也一时无法解释。
如今在Maven项目上实践了这么久,又对这张表有了新的理解。首先,我觉得所谓A对B有依赖,是指A对B的artifact有依赖,也就是依赖的是B的binary。其次依赖范围决定了A对B在什么时间段具有依赖。一共有三种时间段:a)在编译源代码时 b) 在编译测试代码及运行测试用例时 c) 在运行时
四种依赖范围分别表示了在不同的时间段具有依赖:
1)compile: a) & b) & c)
2)test : b)
3)provided: a) & b)
4) runtime: c)
可见test与runtime是最弱的依赖,其次是provided,然后再是compile。下面我们来看传递依赖,我们换个角度,先不从依赖范围来看传递依赖,而是从依赖的时间段来看传递依赖。
第二 第一 |
a) | b) | c) |
a) | - | - | - |
b) | - | - | b) |
c) | - | - | c) |
解释一下,第一列表示A对B的依赖时间段,第二列表示B对C的依赖时间段。首先,如果 A对B是在编译时依赖,那A对C一定没有依赖,因为编译源代码时只需要B的binary即可通过编译,B的依赖都不会需要。所以第二行都为没有依赖。其次如果B对C为编译时依赖,因为之前说过A对B的依赖都是指A对B的binary的依赖,B无需重新编译源代码,所以第二列都为没有依赖。同样的如果B对C为编译和运行测试代码时依赖,因为无论A只对B的binary有依赖(主代码),与B的测试代码没有关系,所以第三列也都为没有依赖。所以现在只剩下表格中最后一列的最后两格需要解释了:
1. A对B在编译及执行测试代码时有依赖,而B对C在主代码运行时有依赖
对编译A的测试代码来说,A只需要B的binary,一定对C没有依赖,但对执行A的测试代码来说,执行时需要调用到B代码,而这时对B来说这是它的主代码的运行时,它对C是有依赖的。所以A对C也就有了依赖(A运行测试代码时对C有依赖)
2. A对B主代码运行时有依赖,而B对C在主代码运行时有依赖
同理,在运行A的主代码时,A需要调用B的主代码,而这时也是B的主代码的运行时,所以B需要调用C。所以A对C也有了依赖(A运行主代码时对C有依赖)。
下面我们来看依赖范围,我们将依赖范围的这张传递依赖表转换成,依赖时间段的传递依赖表:
第一 第二 |
a)&b)&c) |
b) |
a)&b) |
c) |
a)&b)&c) |
b)&c) |
- |
- |
b)&c) |
b) |
b) |
- |
- |
b) |
a)&b) |
b) |
- |
- |
b) |
c) |
c) |
- |
- |
c) |
我们来对比一下原表:
1) compile + compile --> compile, 而我们这里推出的是 b) & c),因为没有一个特定范围对应 b) & c)所以用compile来代替是合理的。
2) compile + provided -->无依赖也是合理的,但有一点必须注意,provided这个范围是比较特殊的,它并不是说在运行时没有依赖,而是说运行时的依赖会由运行环境提供,这点对传递依赖很重要。对于compile + provided的情况,我们必须保证在A的测试环境中C已经存在了 ,不然是会有问题的。因为B假定C在B的运行时已经存在了。比如说 C是servelt api,在deploy B到一个servlet container中时,C会由container提供,但在A的测试和运行环境中,必须也保证C已经存在(特别是A的测试环境)不然就有可能出现runtime exception。
3) compile + runtime --> runtime, 这点有些不合理,这会导致,在A的测试代码运行时,它调用B,而B需要调用C,这时会出现runtime excpetion。(所以我推导出的是 b) & c) ) 我持着怀疑的态度特地在Maven 3.03上验证了一下,确实compile + runtime --> runtime。所以这里我们就要特别小心了,如果A的测试代码运行时,有可能需要间接调用到C,你需要显示声明C为A的compile依赖。 (因为默认是runtime依赖,加上test依赖就是compile依赖)
4)provided + compile --> provided , 这个是很有问题的,首先, A对C在编译时肯定是不需要的(有B的binary就足够编译了)。所以我们推出的是c),也就是只在测试时需要(运行测试代码时需要)。但有一点我们需要多思考一下的,A对B是provided依赖,表明在A的主代码运行时B已经被环境提供了,A在运行时是依赖B的,而B对C是compile依赖,也就是B在运行时对C有依赖,也就是说A在运行时其实是间接依赖C的,而如果A的运行时环境提供了B,没理由不提供B的运行时依赖C, 所以这里最后得到的是provided(因为test无法表示运行时的依赖性)。
5)provided + provided --> provided,虽然我推导出的是无依赖,但由于provided的特殊性,provided并不能简单用 a) & b)来表示,其实在运行时是有依赖的,只是依赖由环境提供。首先A对C肯定在编译时是没有依赖的,但在运行测试代码时是有依赖的,因为B对C是provided依赖,也就是说C由B的运行环境提供,所以在A的测试环境需要提供C。和上节同样的道理,A的运行环境提供了B,没道理不提供B的运行时依赖C(B项目也假定了在其运行时会由环境提供C)所以是provided依赖。
6) provided + runtime --> provided,这点其实得provided + compile --> provided同理。
OK, 这样原先的大部分疑惑都已经解决了,回过头来看一下,主要是provided这个范围比较搞,它并不表示在运行时没有依赖,只是表明依赖会由运行时环境提供,但问题是如何预先知道项目的运行时环境,项目的运行时环境是会变化的。因为如果A在运行时依赖B,A的运行时环境就成了B的运行时环境可能会与原先单独运行B的环境不同。感觉Maven的这一设计有些许问题。
评论
作者自己都不知道?!!! 我也是醉了
哈哈
作者自己都不知道?!!! 我也是醉了
compile+provided => provided,而非无依赖
发表评论
-
《Maven in Action》读后感
2012-02-23 23:48 2168今天终于读完了《Maven in Action》一书,真所谓书 ... -
第十八章 Archetype
2012-02-23 23:30 50281. Archetype 是 Maven ... -
第十七章 编写Maven插件
2012-02-23 19:42 44511. 编写 Maven 插件的主要步骤 ... -
第十六章 m2eclipse
2012-02-23 15:44 23291. m2eclipse ( http: ... -
第十五章 生成项目站点
2012-02-21 09:27 22401. Maven 社区提供了大量插件,能让用户 ... -
第十四章 灵活的构建
2012-02-20 16:21 18271. 通过 <propertie ... -
第十三章 版本管理
2012-02-20 15:57 20591. 版本管理( Version Manage ... -
第十二章 使用Maven构建Web应用
2012-02-15 18:38 59971. Web 项目的 POM ... -
第十一章 使用Hudson进行持续集成
2012-02-09 17:09 22461. 持续集成就是快速 且高频率 ... -
第十章 使用Maven进行测试
2012-02-05 22:17 213011. com.google.code. ... -
第九章 使用Nexus创建私服
2011-12-06 23:17 107491. Nexus 分为开源版和企业版,开源 ... -
第八章 聚合与继承
2011-12-06 09:55 20091. 为了能用一条命令来构建一个实际 ... -
第七章 生命周期和插件
2011-12-05 13:36 22501. Maven 的生命周期就是为了对所有的构 ... -
第六章 仓库
2011-12-03 18:44 23521. Maven 在一个工作站上的某个位置统一 ... -
第五章 坐标和依赖
2011-12-03 15:14 20161. Maven 定义了这样一组规则:世界上任 ... -
第四章 背景案例
2011-12-02 21:20 13871. 主要场景: 1) 用户访问注册页面 2) ... -
第三章 Maven 使用入门
2011-12-01 18:40 25131. 就像Make的Makefile, Ant的build. ... -
第二章 Maven的安装和配置
2011-12-01 10:01 61811. 设置JAVA_HOME, Path中加入%JAVA_H ... -
第一章 Maven 简介
2011-12-01 09:48 22361. Maven 是优秀的构建工 ...
相关推荐
传递依赖 当存在传递依赖的情况时,主工程对间接依赖的jar可以访问吗? 例如:A.jar依赖于B.jar,而B.jar依赖于C.jar,那么要怎么修改配置文件,才会让A.jar 也依赖 C.jar 呢? 这要看传递依赖的jar包引入时的依赖...
附件详细的介绍了Maven依赖在POM文件中的表示、依赖范围的含义以及传递性依赖的使用,也包含依赖调解的两个内容。
这是一个简单的maven依赖的小例子
Java使用Maven导入Spring依赖
springboot 的maven依赖包,含有所有maven依赖,网络不好的可以来下。压缩包3.
这是一个maven依赖+继承+聚合的小例子,用来参考和学习maven
Oracle依赖,maven依赖,ojdbc8的依赖
Maven项目依赖内含druid.properties(阿里巴巴的德鲁伊连接池)和log4j.properties(日志)和jdbcutils.java类(在连接池的情况下获得连接)
maven依赖库,里面含有较为全面的jar包,如果maven无法自动下载依赖库,可手动导入依赖库;该压缩包解压后可以直接在maven项目中指定路径使用。
Geoserver maven 依赖 java
maven 依赖包(完整)适合大多数项目,如:log4j-1.2.17.jar等
将开发过程常用的maven依赖汇总下来了,不用每次都去maven仓库查询,可以节省很多时间
附件为:dubbox2.8.4 maven依赖文件。 使用方法:按照依赖关系,自行创建maven依赖文件夹后,将附件解压至指定文件夹即可使用。 可解决Missing artifact com.alibaba:dubbo:jar:2.8.4 dubbo问题。
基于SSM的人事管理系统源码+项目说明(使用Maven进行依赖包控制).zip 基于SSM的人事管理系统源码+项目说明(使用Maven进行依赖包控制).zip 基于SSM的人事管理系统源码+项目说明(使用Maven进行依赖包控制).zip ...
jackson2.6.0 jar maven依赖 jackson2.6.0 jar maven依赖jackson2.6.0 jar maven依赖jackson2.6.0 jar maven依赖jackson2.6.0 jar maven依赖
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。 书中讲解了网络基础知识、TCP/IP基础知识、数据链路、IP协议、IP协议相关技术、TCP与UDP、路由协议、应用协议、网络安全等内容,引导读者了解和...
maven依赖
基于ACTIVITI引擎进行开发,利用maven进行依赖管理,本文件列出来具体的依赖项
NULL 博文链接:https://xiang-jian.iteye.com/blog/1782036