如何显式配置Spring Boot的Web服务器,避免依赖自动选择?
显式配置Spring Boot 1.5.x使用指定Web服务器
当然可以!你完全可以显式指定Spring Boot使用的Web服务器,不用依赖依赖树的自动推断。针对你在Spring Boot 1.5.x版本中遇到的「引入Jetty相关依赖后自动替换Tomcat」的问题,这里有两种靠谱的解决方法:
方法一:通过依赖管理强制锁定目标Web服务器
你的项目中引入的org.eclipse.jetty.websocket:javax-websocket-server-impl会间接带入Jetty服务器核心依赖,触发Spring Boot的自动配置逻辑切换到Jetty。你可以通过排除Jetty的服务器依赖+显式引入Tomcat嵌入式依赖的方式,强制Spring Boot使用Tomcat:
修改pom.xml的依赖配置如下:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.5.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>1.5.7.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>org.eclipse.jetty.websocket</groupId> <artifactId>javax-websocket-server-impl</artifactId> <version>9.4.8.v20171121</version> <!-- 排除会触发Jetty自动配置的核心依赖 --> <exclusions> <exclusion> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> </exclusion> <exclusion> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-servlet</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入Tomcat嵌入式依赖,确保优先级高于Jetty --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <version>1.5.7.RELEASE</version> <scope>compile</scope> </dependency> </dependencies>
这样配置后,即使Jetty的WebSocket依赖存在,Spring Boot也会优先使用你显式声明的Tomcat容器。
方法二:通过Java配置类自定义Web服务器工厂
如果依赖管理的方式不够灵活,你可以编写配置类,显式创建目标Web服务器的工厂Bean,直接覆盖Spring Boot的自动配置逻辑:
比如要强制使用Tomcat,创建如下配置类:
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class WebServerConfig { @Bean public TomcatEmbeddedServletContainerFactory tomcatContainerFactory() { // 这里可以自定义Tomcat的各项配置,比如端口、线程池、连接超时等 TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); factory.setPort(8080); // 示例:设置服务端口为8080 return factory; } }
当Spring容器中存在这个自定义的Bean时,会忽略对Jetty容器的自动检测,直接使用你配置的Tomcat实例。
额外说明
正如你提到的,这个问题在Spring Boot 2.x版本中已经不存在——2.x调整了Web服务器自动配置的优先级逻辑,只有当你显式引入对应容器的starter依赖时,才会切换默认容器,不会因为间接引入的依赖而自动替换。
内容的提问来源于stack exchange,提问作者Sven Hettwer




