上次读书笔记中,提到了依赖传递。看着依赖传递表,一直在思考为什么会是这样。

先看传递表:

compile test provided runtime

compile

test

provided

runtime

compile

test

provided

runtime

-

-

-

-

-

-

-

-

runtime

test

provided

runtime

(最左边一列表示第一依赖范围,最上边一行表示第二依赖范围)

需要详细理解的知识点

1.首先看看scope的作用:scope是用来排除多余的依赖范围的。按我自己的理解,不能理解一个字段在什么时候有用,而是在什么时候不需要它,在什么时候,添加了这个范围就会出现操作失败的情况:

compile:所有阶段都有用,

provided:在运行的时候不需要使用这个依赖,更官方的说法为期望在运行时由运行环境提供api。

test:在编译和运行的时候都不要使用这个依赖【具体理解应该是在正式的使用mvn package或者mvn compile的时候无效,但是对于编译器来说,是一直有效的,因为测试也需要编译和运行的】

runtime:对于编译的时候不需要使用这个依赖【例:JDBC驱动,在编译的时候只需要提供一个接口,具体使用在运行的时候再提供就行】

理解记忆的话:

test算是一个独立的模块。如果对于上面的依赖传递表格不理解的话,可以先把test行和test列给去除,再结合2,3知识点,就很容易理解了

priovided和runtime是对立的,一个对运行时不需要,一个对编译时不需要。 参考理解jdk和jre

2.编译时和运行时具体区别在哪里?

具体的可以看看《深入理解JVM》

只说一点关键的:

编译过程中,对于依赖,可以没有具体的实现,但是需要有这个接口文件,不需要有具体的实现。[可以只有interface文件]

运行过程中,对于依赖,必须要有具体的实现。[还要有具体的implement文件]

3.依赖是指的依赖编译好的二进制文件,编译过程会把所有的依赖编译进生成的二进制文件中,这一点很重要

而依赖是否传递,主要看是否需要运行或编译文件,与test无关

因此:

先看看第一依赖为compile的时候:(运行和编译都需要此依赖)

第二依赖对库的依赖为compile的时候:

表示任何时候都需要这个lib,而编译的时候这个lib已近被第二依赖编译进二进制文件,因此

现在的库对于第二依赖在编译的时候,不需要再编译一次,因此应该是在运行时和测试时有效,所以应该为runtime,但是官方解释:

it is intended that this should be runtime scope instead, so that all compile dependencies must be explicitly listed - however, there is the case where the library you depend on extends a class from another library, forcing you to have available at compile time. For this reason, compile time dependencies remain as compile scope even when they are transitive.

第二依赖对库的依赖为test的时候:

第二依赖的运行和编译都不需要这个库,因此,依赖是不会传递的

第二依赖对库的依赖为provided的时候:

第二依赖在运行时不需要这个库,而编译的时候这个lib已近被第二依赖编译进二进制文件,因此编译运行都不需要这个库,因此,依赖不会传递

第二依赖对库的依赖为runtime的时候:

第二依赖在编译的时候不需要这个库,但是在运行和测试的时候需要这个库,那么同理第一依赖编译的时候是不需要这个库的。因此为runtime。

第一依赖为test的时候:(运行和编译都需要此库)

第二依赖对库的依赖为compile的时候:

第一依赖只需要用第二依赖进行测试,第二依赖对这个依赖任何时候都需要(其实只需要再运行的时候用它,因为已经被编译到二进制文件中了),因此在只需要在测试的时候,运行这个包,因此为test

第二依赖对库的依赖为test的时候:

第一依赖只需要用第二依赖进行测试,第二依赖运行和编译的时候都不需要他,因为依赖不传递

第二依赖对库的依赖为provided的时候:

第一依赖对第二依赖进行测试,第二依赖在运行的时候不需要这个这个库,而编译的时候这个lib已近被第二依赖编译进二进制文件,因此依赖不传递。

第二依赖对库的依赖为runtime的时候:

第二依赖在编译的时候不需要这个库,而在运行和测试的时候需要这个库,而在测试的时候需要运行这个库,因此为test

可以看出来compile和test很像,在proivde和test都不传递。而在compile和runtime都会传递,因为proivde对于被依赖项来说已经编译好了,所以不再需要传递

第一依赖为provided的时候:(在编译和运行测试代码的时候需要此库)

provided算是一个比较特殊的依赖。需要注意的是,我们的代码并不是在运行时不需要这个库,而是表示在运行时让运行环境提供这个api。

因此如果按照表示主代码在运行时让运行环境提供这个依赖的运行api,那么在第一依赖需要运行第二依赖的时候,依赖都为provided

第二依赖为compile的时候:(运行和编译都需要此库)

按照上面的说法,应该为provided

第二依赖对库的依赖为test的时候:

第一依赖只需要用第二依赖进行测试,第二依赖运行和编译的时候都不需要他,因为依赖不传递

第二依赖对库的依赖为provided的时候:

第一依赖对第二依赖进行测试,第二依赖在运行的时候不需要这个这个库,而编译的时候这个lib已近被第二依赖编译进二进制文件,因此依赖不传递。

第二依赖对库的依赖为runtime的时候:

第二依赖在运行的时候需要这个库,因此为provided

第一依赖为runtime的时候:(在运行的时候需要此库)

第二依赖为compile的时候:(运行和编译都需要此库)

表示任何时候都需要这个lib,而编译的时候这个lib已近被第二依赖编译进二进制文件,因此

现在的库对于第二依赖在编译的时候,不需要再编译一次,因此应该是在运行时和测试时有效,因此为runtime

第二依赖对库的依赖为test的时候:

第一依赖只需要用第二依赖进行测试,第二依赖运行和编译的时候都不需要他,因为依赖不传递

第二依赖对库的依赖为provided的时候:

第一依赖对第二依赖进行测试,第二依赖在运行的时候不需要这个这个库,而编译的时候这个lib已近被第二依赖编译进二进制文件,因此依赖不传递。

第二依赖对库的依赖为runtime的时候:

第二依赖在编译的时候不需要这个库,而在运行和测试的时候需要这个库,因此为runtime

读书笔记-《Maven实战》-关于Maven依赖传递的思考 2018/4/26的更多相关文章

  1. AngularJS in Action读书笔记6(实战篇)——bug hunting

    这一系列文章感觉写的不好,思维跨度很大,原本是由于与<Angularjs in action>有种相见恨晚而激发要写点读后感之类的文章,但是在翻译或是阐述的时候还是会心有余而力不足,零零总 ...

  2. Maven实战:Maven生命周期

    前言 之前有写过一篇文章Maven实战,介绍了Maven的一些基本概念,以及对于一个初学者而言的Maven基础知识,当时在我看来掌握了这些基本是够用的. 随着工作的深入,越来越感觉对于Maven的理解 ...

  3. Maven实战——常用Maven插件介绍

    maven nexus 库已上传了第三方jar,但就是用mvn compile下不到本地 回答于 2013-06-04 14:40 你是通过何种方式上传到nexus的? 有给pom文件吗? 如果是单纯 ...

  4. 【转】Maven实战(七)---传递依赖

    原博文出自于:http://blog.csdn.net/liutengteng130/article/details/47000069   感谢! 假设A-->C  B-->A      ...

  5. 【Maven实战】传递性依赖的问题

    在上一篇文章中我们已经介绍了依赖性,这次我们再来介绍下传递依赖的问题,首先我们还是在上篇文章基础之上进行编写. 1.上篇文章中已经建立了一个user-core的模块,现在首先再建立一个user-log ...

  6. maven实战(03)_依赖

    (一) 依赖配置声明 包含以下的一些元素: <project> ... <dependencies> <dependency> <groupId>... ...

  7. 【Maven实战】Maven开发环境的搭建和案例展示

    1.首先到www.apache.org中下载maven,得到一个apache-maven-3.1.0-bin.zip的压缩包. 2.将此压缩包解压,这里解压到D:\docs中,然后找到maven的bi ...

  8. (转)Spring读书笔记-----Spring核心机制:依赖注入

    Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因此,我们说这些对象间存在依赖关系.加入A组件调用了B组件的方法,我们就 ...

  9. Spring读书笔记-----Spring核心机制:依赖注入

    spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.今天就和大家一起来学习一下 依赖注入的基本概念 依赖注入(Dependecy Injection),也称为IoC(I ...

随机推荐

  1. 定点化_mif文件生成

    clc; %全屏清零 clear all; %变量清零 N=^; %设置ROM深度(字变量)的变量参数, s_p=:; %正弦波一个周期的采样点数 sin_data=sin(*pi*s_p/N); % ...

  2. python基础二(基础数据类型)

    一. 引子 1. 什么是数据 x=10,10是我们要存储的数据 2. 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3.数据类型 数字 字符串 列表 元组 字 ...

  3. NetSNMP开源代码学习——mib扩展

    扩展MIB库关于MIB库的扩展网络文章非常多,这里我主要参考了http://blog.csdn.net/qq_27204267/article/details/51595708,这篇文章介绍的比较简单 ...

  4. 关于阮大神的es6标准入门第一章

    题记:之前在10月份的时候写过阮大神的es6的第一章,但是由于那段时间项目组的动荡,所以也没有什么后续,导致我现在对es6基本都忘的差不多了,不过,现在换了新公司,最近也没什么任务,所以现在开始重新写 ...

  5. Treap讲解

    Treap讲解 上一篇blog提出了Treap这个算法,在这里我就要详细讲解. 首先,我们可以从字面上理解这个算法,Treap这个单词是由Tree和Heap两个单词构成的,所以它的性质就很好理解了,明 ...

  6. 一个web程序员的年终总结

    2017年年终总结(就是一个程序员的瞎叨叨): 从来到中科院到现在,很开心可以在这留下来.毕竟对于我来说,这里符合我对自己毕业后前两年的规划.我是一个很慢的人,特别是对于我想做好的事情,我会非常认真仔 ...

  7. EventBus InMemory 的实践基于eShopOnContainers (二)

    前言 最近在工作中遇到了一个需求,会用到EventBus,正好看到eShopOnContainers上有相关的实例,去研究了研究.下面来分享一下用EventBus 来改造一下我们上篇Event发布与实 ...

  8. Lazy Loading | Explicit Loading | Eager Loading in EntityFramework and EntityFramework.Core

    EntityFramework Eagerly Loading Eager loading is the process whereby a query for one type of entity ...

  9. [Codeforces 922E]Birds

    Description 题库链接 一条直线上有 \(n\) 棵树,每棵树上有 \(c_i\) 只鸟,在一棵树底下召唤一只鸟的魔法代价是 \(cost_i\) 每召唤一只鸟,魔法上限会增加 \(B\) ...

  10. [IOI 2011]ricehub

    Description 乡间有一条笔直而长的路称为“米道”.沿着这条米道上 R 块稻田,每块稻田的坐标均为一个 1 到 L 之间(含 1 和 L)的整数.这些稻田按照坐标以不减的顺序给出,即对于 0 ...