一、问题
在上一篇《SpringBoot项目启动不走内嵌容器》中发现,provided会影响子依赖。
标记为scope:provided的jar在编译和运行时有作用,表明了运行时dependency 由JDK或者容器提供
那么问题来了:有个项目,依赖了jar包A,然后A又依赖B,B又依赖C,C又依赖D,现在给A加了scope:provided,那么运行时的BCD也是由JDK或者容器提供吗?
二、实验分析
新建个测试项目
用spring-boot-starter-web
做实验
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
......
</dependencies>
我们点进去看spring-boot-starter-web
的依赖关系,如下图
我们可以发现,spring-boot-starter-web
依赖于spring-boot-starter
,spring-boot-starter
又依赖于spring-boot
,spring-boot
又依赖于tomcat-embed-core
。
2.1 实验一:不加provided启动
我们现在启动项目,项目正常,走的是springboot内嵌的tomcat
2.2 实验二:加上provided启动
我们现在加上scope:provided,
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>provided</scope>
</dependency>
......
</dependencies>
再启动项目,发现走的还是springboot内嵌的tomcat
2.3 实验三:给子依赖加上provided启动
我们现在去掉org.springframework.boot
的provided,转而给他的子依赖spring-boot-starter
加上provided试试
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
......
</dependencies>
启动起来,发现没走springboot的内嵌容器,而是走的JDK配置tomcat容器
三、结论
maven的scope:provided会影响它的两级子依赖。
我们现在回答章节一的问题
问题:有个项目,依赖了jar包A,然后A又依赖B,B又依赖C,C又依赖D,现在给A加了scope:provided,那么运行时的BCD也是由JDK或者容器提供吗?
答案:BC由容器提供,D不是。