You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot应用无报错但未启动嵌入式Tomcat,接口访问失败求助

排查Spring Boot未启动Tomcat的常见原因

我之前刚接触Spring Boot的时候也踩过这个坑!明明选了Web组件,代码也写了,启动没报错就是访问不了,后来排查发现是这些常见问题,你可以一个个核对:

  • Web Starter依赖缺失或异常
    先检查你的构建文件(Maven的pom.xml或者Gradle的build.gradle)里有没有spring-boot-starter-web依赖。这个依赖是Spring Boot启动Tomcat和Web功能的核心,要是没加上或者被意外注释了,Spring Boot就不会初始化Web容器。
    Maven正确的依赖配置应该是:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    Gradle的话是:

    implementation 'org.springframework.boot:spring-boot-starter-web'
    

    另外还要注意,如果用的是Spring Boot 3.x版本,你的JDK必须是17及以上,版本不兼容也可能导致Web容器静默启动失败(虽然一般会报错,但偶尔也有特殊情况)。

  • 启动类包位置不正确
    Spring Boot的启动类(就是带@SpringBootApplication注解的那个类)默认只会扫描自身所在包及其子包的组件。比如你的HelloControllercom.example.demo.controller包下,那启动类必须放在com.example.demo或者更上层的包(比如com.example)里。如果启动类在com.test这种完全不相关的包,Spring扫描不到你的Controller,也不会触发Web容器的启动逻辑。

  • 配置文件禁用了Web环境
    去看看你的application.properties或者application.yml里有没有类似这样的配置:

    spring.main.web-application-type=none
    

    或者YAML格式:

    spring:
      main:
        web-application-type: none
    

    这个配置会强制Spring Boot以非Web应用模式启动,自然不会启动Tomcat。如果是不小心加上的,删掉或者改成web-application-type=servlet就行。

  • Tomcat依赖被意外排除
    有时候可能会不小心在spring-boot-starter-web里排除了Tomcat的依赖,比如:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    要是有这个排除项,又没引入其他Web容器(比如Jetty、Undertow),那Spring Boot就没有可用的Web容器,自然不会启动Tomcat。

  • 运行方式错误
    确认你是通过启动类的main方法来运行应用的,或者用正确的构建命令:

    • Maven:mvn spring-boot:run
    • Gradle:./gradlew bootRun
      要是你直接运行了Controller类,或者用普通的mvn run命令,那只会执行单个类的逻辑,不会启动整个Spring Boot应用,Tomcat自然也不会启动。

内容的提问来源于stack exchange,提问作者avseq

火山引擎 最新活动