spring 启动时使用外部服务器,还是部署在外部服务器上作为 war 时使用嵌入式服务器?

Does spring boot uses external server, or embedded server when deployed on external server as war?

我知道如果我们想在外部服务器上部署 spring 引导网络应用程序,我们应该排除嵌入式 服务器,但如果我们不这样做会怎样?假设我在 jboss 外部服务器上部署 spring 启动 war,但我没有排除 tomcat 服务器?在那种情况下,spring 启动是否使用 jboss 外部服务器,还是使用嵌入式 tomcat 一个?

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

在双重打包场景中,理想情况下,您应该按照提供的方式指定 tomcat 依赖项,这样您将在 WEB-INF/lib-provided 而不是 WEB-INF/lib 下拥有 tomcat 依赖项。因此,对于外部服务器,lib 提供的文件夹将被忽略,但对于独立 spring 启动应用程序 tomcat 依赖项将从 lib 提供的文件夹中嵌入加载。

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