当前位置: 首页 > 知识库问答 >
问题:

Springboot为什么要设置spring-boot-starter-tomcat

邢骏
2023-03-14

当将Springboot maven项目(版本2.3.4.release)部署到外部Tomcat容器时,官方指南说您需要按照提供的方式标记“spring-boot-starter-tomcat”依赖项,但实际上即使不这样做,包含“spring-boot-starter-tomcat”、“tomcat-embed-core”和“tomcat-embed-websocket”等lib的最终war包在Tomcat8.5.54或Tomcat9.0中也可以正常工作,所以我对此感到困惑,“我们真的需要将spring-boot-starter-tomcat设置为提供的吗?”有人能解释为什么吗?“传统部署”

共有1个答案

璩慎之
2023-03-14

您不希望在类路径上有相同类的多个版本。这会在运行时导致许多错误。例如,如果您有一个

public class MyServlet implements javax.servlet.Servlet

并且将myservlet.classjavax.servlet-api.jar(其中包含javax.servlet.servlet)打包到应用程序中,可能会出现错误:

Servlet class MyServlet is not a javax.servlet.Servlet

发生的情况是:当应用程序classloader加载MyServlet时,它首先在应用程序中查找javax.servlet.servlet,然后在javax.servlet-api.jar中找到它。服务器将这个类与服务器的classloader加载的类进行比较,并得出结论认为它们是不同的,因为来自不同JAR的类是不相等的。如果不提供javax.servlet-api.jar,则不会出现这种情况:classloader在它自己的类路径中找不到javax.servlet.servlet,所以它在父类loader中查找。

TL;DR:由于上面的注释,将spring-boot-starter-tomcat留在compile作用域中可能没有坏处,但这是一个不值得冒的风险。

 类似资料:
  • 本文向大家介绍为什么要用 spring boot?相关面试题,主要包含被问及为什么要用 spring boot?时的应答技巧和注意事项,需要的朋友参考一下 配置简单 独立运行 自动装配 无代码生成和 xml 配置 提供应用监控 易上手 提升开发效率

  • 我正在为单页应用程序使用新的msal . js(https://www . NPM js . com/package/@ azure/msal-browser)。好消息是我已经搞定了!因此,在登录azure ad后,我通过访问代码被重定向到我的应用程序,msal通过该代码从azure代码中获取access token/refresh token/id token。 之后,我将使用accesstok

  • 根据https://docs.spring.io/spring-boot/docs/2.0.0.m5/reference/html/howto-embedded-web-servers.html和spring-boot-starter-web的pom:https://search.maven.org/artifact/org.springframework.boot/spring-boot-sta

  • 问题内容: 在Spring Boot中,模式上有一些jar 。所有这些罐子都不包含任何包装。它们有什么用? 在Maven POM中,添加了以下依赖项: org.springframework.boot:spring-boot-starter-web org.springframework.boot:spring-boot-starter-actuator org.springframework.b

  • 我的项目root目录下pom文件添加了springboot的依赖 前端的目录下pom中添加了,要用到@restcontroller 然后一堆包冲突,是不是我的做法有错误,还是版本问题?

  • 简介 ShardingSphere-JDBC 提供官方的 Spring Boot Starter,使开发者可以非常便捷的整合 ShardingSphere-JDBC 和 Spring Boot。 数据源配置 spring.shardingsphere.schema.name= # JDBC数据源别名 spring.shardingsphere.datasource.names= # 数据源名称,