以下面dependency为例

1 <dependency>
2 <groupId>javax.servlet</groupId>
3 <artifactId>javax.servlet-api</artifactId>
4 <version>3.1.0</version>
5 <scope>provided</scope>
6 </dependency>

当子工程中引入某个依赖时,可见其设置<scope>provided</scope>,那么后续依赖该工程的所有项目会可能出现找不到这个依赖,原因是:

1.provided是没有传递性的。即,如果你依赖的某个jar包,它的某个jar的范围是provided,那么该jar不会在你的工程中依靠jar依赖传递加入到你的工程中。

2.provided具有继承性,上面的情况,如果需要统一配置一个组织的通用的provided依赖,可以使用parent,然后在所有工程中继承

比如:我现在有个工程结构图如下:

假设GranParent中的pom.xml是个超级pom.xml文件,

Parent继承GranParent

 <modelVersion>4.0.0</modelVersion>
<groupId>com.alice</groupId>
<artifactId>Parent</artifactId>
<version>1.0.0-SNAPSHOT</version> <parent>
<groupId>com.alice</groupId>
<artifactId>GrandParent</artifactId>
<version>1.0.0</version>
</parent> <modules>
<module>childA</module>
<module>childB</module>
<module>childB</module>
</modules>
<packaging>pom</packaging>

childA的pom.xml

 <parent>
<groupId>com.alice</groupId>
<artifactId>Parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>childA</artifactId> <name>childA</name>
<packaging>jar</packaging> <dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependencies>

childB的pom.xml,其中依赖childA

 <modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.alice</groupId>
<artifactId>Parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>childB</artifactId> <name>childB</name>
<packaging>jar</packaging> <dependencies>
<dependency>
<groupId>com.alice</groupId>
<artifactId>childA</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

childC的pom.xml,其中依赖childB

 1 <modelVersion>4.0.0</modelVersion>
2 <parent>
3 <groupId>com.alice</groupId>
4 <artifactId>Parent</artifactId>
5 <version>1.0.0-SNAPSHOT</version>
6 </parent>
7 <artifactId>childC</artifactId>
8
9 <name>childC</name>
10 <packaging>jar</packaging>
11
12 <dependencies>
13 <dependency>
14 <groupId>com.alice</groupId>
15 <artifactId>childB</artifactId>
16 <version>1.0.0-SNAPSHOT</version>
17 </dependency>
18 </dependencies>

从上面的pom文件可知,

在childA中,javax.servlet的scope为provided

首先解释下为啥设置为provided:

  因为是tomcat中也有servlet-api包,如果默认为compile,即项目在编译,测试,运行阶段都需要这个artifact对应的jar包在classpath中,那么在使用tomcat运行时就会发生了冲突,由于provided只影响编译和测试阶段,在编译测试阶段,我们需要这个artifact对应的jar包在classpath中,而在运行阶段,假定目标的容器(比如我们这里的tomcat容器)已经提供了这个jar包,所以无需我们这个artifact对应的jar包了,那么在实际发布时会默认使用第三方web服务器中提供的jar包,而不会使用本jar包。

由于childB直接依赖childA,所以childB在测试编译阶段可引入servlet-api包,程序可以正常跑通,

但是childC依赖B,而childC也是需要childA中的servlet-api包,但是由于provided没有传递性,scope在不指明情况下默认为copmpile,所以childC和childA是间接依赖关系,所以childC无法引用servlet-api包,导致运行报错,此时需要单独在childC中加servlet-api依赖包,

 1 <modelVersion>4.0.0</modelVersion>
2 <parent>
3 <groupId>com.alice</groupId>
4 <artifactId>Parent</artifactId>
5 <version>1.0.0-SNAPSHOT</version>
6 </parent>
7 <artifactId>childC</artifactId>
8
9 <name>childC</name>
10 <packaging>jar</packaging>
11
12 <dependencies>
13 <dependency>
14 <groupId>com.alice</groupId>
15 <artifactId>childB</artifactId>
16 <version>1.0.0-SNAPSHOT</version>
17 </dependency>
18 <dependency>
19 <groupId>javax.servlet</groupId>
20 <artifactId>javax.servlet-api</artifactId>
21 <version>3.1.0</version>
22 <scope>test</scope>
23 </dependency>
24 </dependencies>

什么是传递性依赖(https://blog.csdn.net/lewky_liu/article/details/78145211)
有时候我们在pom.xml文件中引入的依赖,其本身就需要依赖于其他的依赖,这时候我们不需要去考虑这些依赖,Maven会解析各个直接依赖的pom,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。

通过传递性依赖,我们可以在pom.xml文件中少写不少的依赖配置

传递性依赖的依赖范围
假如当前项目为A,A依赖于B,B依赖于C。此时称A对于B是第一直接依赖,B对于C是第二直接依赖,而A对于C是传递性依赖。只要知道B在A项目中的scope,就可以知道C在A中的scope。其依赖范围如下:

表格的第一列是B在A中的依赖范围,第一行是C在B中的依赖范围,交叉的格子是C在A中的依赖范围

当C在B中的scope为test时,A不依赖C,C直接被丢弃
当C在B中的scope为provided时,只有当B在A中的scope也是provided时,A才会依赖C,这时候C在A的scope是provided
当C在B中的scope为compile或runtime时,A依赖C,此时C在A中的scope继承自B在A的scope。注意,如果C的scope是runtime,B的scope是compile,此时C在A的scope是runtime,而不是compile

参考https://blog.csdn.net/u013704227/article/details/46460913

https://blog.csdn.net/lewky_liu/article/details/78145211

scope为provided的更多相关文章

  1. Maven的scope的值

    Maven的依赖范围 在pom.xml文件中,有个元素是scope,用来表示依赖的范围.之所以会有依赖范围,是因为Maven在编译.测试和运行项目时会各自使用一套classpath,依赖范围就是用来控 ...

  2. mvn scope (转)

    策略一: 对于容器提供的(如:servlet-api-2.3等)和测试需要时的(如:junit-3.81等),可以直接在pom.xml中去掉. maven的dependency中有一个tag是< ...

  3. Maven pom文件中dependency scope用法

    在Maven中依赖的域有:compile.provided.runtime.system.test.import 一.compile(默认) 当依赖的scope为compile的时候,那么当前这个依赖 ...

  4. Maven中依赖的scope的依赖范围

    在Maven中依赖的域有这几个:import.provided.runtime.compile.system.test 1compile 的范围 当依赖的scope为compile的时候,那么当前这个 ...

  5. spring boot 项目添加maven依赖时provided

    spring boot 项目是自带tomcat 的,但是我们有时候是需要把项目打包成war 然后放到独立的tomcat中运行的,这个时候我们就需要将它自带的tomcat给排除开,这时候我们就可以使用& ...

  6. maven学习(下)利用Profile构建不同环境的部署包

    接上回继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5种环境:本机环境(local).(开发小组内自测的)开发环境(dev).(提供给测试团队的)测试环境(test).预发布环境(pre) ...

  7. Maven安装配置使用

    Maven介绍 Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理 ...

  8. Maven下java.lang.NoClassDefFoundError

    本文转载自:http://blog.csdn.net/qqhjqs/article/details/51491516 使用maven管理web项目中jar包之间的依赖,非常的方便好用,但是有时也会出现 ...

  9. [Maven]Apache Maven 入门篇

    作者:George Ma 上 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 ma ...

随机推荐

  1. P1093 铺地毯

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 \(n\) 张地毯,编号从 \(1\) 到 \(n\) .现在将这些地毯按 ...

  2. P1080 探测器

    题目描述 一个 n*n 的网格图上有 m 个探测器,每个探测器有个探测半径r,问这 n*n 个点中有多少个点能被探测到. 网格图上的点的坐标从(1,1)到(n,n). 输入格式 第一行3个整数n,m, ...

  3. P1074 彩票摇奖

    题目描述 为了丰富人民群众的生活.支持某些社会公益事业,北塔市设置了一项彩票.该彩票的规则是: (1) 每张彩票上印有 7 个各不相同的号码,且这些号码的取指范围为 1~33. (2) 每次在兑奖前都 ...

  4. Java8 API学习2 - java.lang.CharSequence, java.lang.String

    CharSequence public interface CharSequence 字符序列接口, 实现此接口的非抽象类有String, StringBuffer, StringBuilder. 从 ...

  5. linux seq_file 接口

    如我们上面提到的, 在 /proc 下的大文件的实现有点麻烦. 一直以来, /proc 方法因为 当输出数量变大时的错误实现变得声名狼藉. 作为一种清理 /proc 代码以及使内核开发 者活得轻松些的 ...

  6. CSS多余文本省略号显示

    CSS多余文本省略号显示 本次案例代码是在 elementui 当中的 table 组件中实际需求 当然使用的是纯 CSS3 代码,所以原生支持度高,兼容性高,所以可多场景应用 对于过长文本进行单行省 ...

  7. Python3使用过程中需要注意的点

    命名规则 变量 变量名只能是数字.字母或下划线的任意组合 变量名的第一个字符不能是数字 不能使用关键字作为变量名 变量的定义要具有可描述性 变量名不宜过长.不宜使用中文.拼音 常量(常用在配置文件中) ...

  8. 51nod 范德蒙矩阵

    思路: 根据矩阵乘法的定义,G中的第i行第j列的元素 ai,j ,对答案的贡献为 ai,j∗ T中第j行的所有元素之和. 因此我们可以将T中根据每行的和进行排序.第i行的和可以通过公式 (ai^n−1 ...

  9. Android Simulator Shortcut keys

    按钮 快捷键 Back Ctrl+Backspace Battery Ctrl+Shift+B Cellular Ctrl+Shift+C D-pad Ctrl+Shift+D Enter zoom ...

  10. Hbase概念原理扫盲

    一.Hbase简介 1.什么是Hbase Hbase的原型是google的BigTable论文,收到了该论文思想的启发,目前作为hadoop的子项目来开发维护,用于支持结构化的数据存储. Hbase是 ...