scope:provided影响子依赖

一、问题

在上一篇《SpringBoot项目启动不走内嵌容器》中发现,provided会影响子依赖。

标记为scope:provided的jar在编译和运行时有作用,表明了运行时dependency 由JDK或者容器提供

那么问题来了:有个项目,依赖了jar包A,然后A又依赖B,B又依赖C,C又依赖D,现在给A加了scope:provided,那么运行时的B\C\D也是由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-starterspring-boot-starter又依赖于spring-bootspring-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,那么运行时的B\C\D也是由JDK或者容器提供吗?

答案:B\C由容器提供,D不是。

posted @ 2019-08-02 17:20  这个人在加班  阅读(882)  评论(0编辑  收藏  举报