Spring booot项目排除内置tomcat的一些问题

众所周知,Spring boot中内置了tomcat,所以可以将项目直接打包成jar包后运行在内置的tomcat上。然而,有时候希望将项目打包为war包,此时往往需要排除内置的tomcat依赖。今天发现我的项目中并没有排除内置的tomcat,并且打包为war包运行在外置tomcat上,运行过程一切正常,说好的要排除内置的tomcat呢?为何即使不排除,打成的war包也能正常跑起来呢?

我决定探究一下这个反常问题出现的原因

首先,需要了解springboot内置的tomcat的scope是什么:
点开pom文件中的spring-boot-starter-web:
在这里插入图片描述
点开后发现其pom中没有tomcat的依赖,但是它继承了父pom:
在这里插入图片描述
接着点开其父pom (spring-boot-starters) 发现其中仍然没有tomcat依赖,但是发现了它上面还有爸爸:
在这里插入图片描述
点开这个爸爸,发现其中仍然没有tomcat相关依赖,好在它还有爸爸:
在这里插入图片描述

点开这个spring-boot-dependencies之后,终于看到了<dependencyManagement>标签中的tomcat依赖,显然,它的scope是 compile:
在这里插入图片描述

以上这些操作只为说明一件事,spring boot内置的tomcat的scope是compile范围的

有了这个信息,就能明白为何网上说如果使用外置tomcat运行需要排除spring boot内置的tomcat了 :
因为内置的tomcat是complie类型的,会被打包进war包,这样就和外置的tomcat产生冲突了

回到讨论的问题:为何有时候不排除内置tomcat仍旧可以运行呢,因为多数情况下排除内置tomcat后开发人员会重新引入一个provided类型的tomcat依赖(这样首先是不会打包进war包从而引发jar包冲突)来作为测试使用,根据maven的最短路径优先原则,如果这个用户引入的tomcat依赖比内置的tomcat的依赖路径短,则会替代内置tomcat,相当于已经自动排除了内置tomat了(我这里就是这个情况)。 显然,如果用户即没排除内置tomcat也没主动引入provided类型的tomcat,则注定要产生jar包冲突

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

说白了就一句话,我的项目中主动引入了scope为provided的tomcat作为测试使用,所以maven的最短路径优先原则已经自动将spring boot内置tomcat排除了,所以没有手动排除也能正常运行;然而,未必每次都那么幸运(用户引入的tomcat依赖路径比内置tomcat还长),所以习惯性将内置tomcat排除

然而,为了保险起见(未必每次都是用户自己引入的tomcat路径更短),习惯性排除内置tomcat

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值