当部署在外部服务器上作为战争时,spring boot 是使用外部服务器还是嵌入式服务器?

Posted

技术标签:

【中文标题】当部署在外部服务器上作为战争时,spring boot 是使用外部服务器还是嵌入式服务器?【英文标题】:Does spring boot uses external server, or embedded server when deployed on external server as war? 【发布时间】:2020-08-20 13:12:32 【问题描述】:

我知道如果我们想在外部服务器上部署 Spring Boot Web 应用程序,我们应该排除嵌入式 服务器,但如果我们不这样做会发生什么?假设我在 jboss 外部服务器上部署 spring boot war,但我没有排除 tomcat 服务器?在这种情况下,spring boot 是使用 jboss 外部服务器,还是仍然使用嵌入式 tomcat 一个?

【问题讨论】:

@AniketSahrawat 感谢您的快速回复。你能详细说明一下吗?为什么不使用嵌入式服务器? 为什么不启动嵌入式服务器? spring boot 知道如果它有嵌入式服务器,它应该启动它并使用它?是不是在 Spring Boot 源代码中说,如果嵌入式服务器部署在外部服务器上,则不要使用嵌入式服务器? 【参考方案1】:

在双重打包场景中,理想情况下,您应该指定tomcat 依赖项,以便您在WEB-INF/lib-provided 下而不是WEB-INF/lib 下拥有tomcat 依赖项。因此,外部服务器 lib-provided 文件夹将被忽略,但独立 spring boot 应用程序 tomcat 依赖项将作为嵌入从 lib-provided 文件夹加载。

请注意,如果您不排除或提供 tomcat 依赖项,外部服务器可能会失败或工作在不一致状态,甚至可以在某些版本中正常工作而在另一个版本中失败,具体取决于服务器对重复库的处理。

【讨论】:

【参考方案2】:

如果您不排除 tomcat-dependencies 也不将依赖项声明为 provided,则在 wildfly 19.0.0 上部署 war 失败。与java.lang.RuntimeException: java.lang.ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to io.undertow.websockets.jsr.ServerWebSocketContainer `

【讨论】:

我用的是jboss 10,它没有失败,所以这意味着spring使用外部jboss服务器没有嵌入对吗? 你能分享你的依赖吗? 我通过 spring 初始化程序创建了应用程序,我没有为 tomcat 指定“提供” 如果部署成功并且您在 jboss 上看到了该应用程序,那么该应用程序将通过您的 jboss 提供服务:-D

以上是关于当部署在外部服务器上作为战争时,spring boot 是使用外部服务器还是嵌入式服务器?的主要内容,如果未能解决你的问题,请参考以下文章

春季启动战争log4j2

在外部 tomcat 中定义 Spring Boot 应用程序的上下文路径

Spring Boot REST Controller 部署在外部 tomcat 9 服务器上时返回 404

无法在外部 tomcat 上部署 Spring Boot 应用程序

是否可以在外部应用服务器上运行 Spring Cloud Gateway?

尝试在外部在tomcat 9上运行带有rest控制器的spring boot war文件