You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何显式配置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

火山引擎 最新活动