You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot项目部署外部Tomcat后API无法访问求助

Spring Boot外部Tomcat部署后API访问404问题

问题描述

本人是Spring Boot新手,已将项目部署到外部Tomcat服务器,但无法访问其中的资源。访问地址http://127.0.0.1:8282/apk/getpublicresource时返回404错误,但相同API在嵌入式Tomcat中运行正常。

相关配置及日志信息

1. application.properties配置

server..port=9998

2. pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <packaging>war</packaging>
    <groupId>com.example</groupId>
    <artifactId>wardemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>wardemo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--tomcat dependency-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <!--tomcat dependency-->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>wardemo</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <executable>true</executable>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

3. Controller代码

package com.example.wardemo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class BasicController {

 @RequestMapping("/getpublicresource")
    public String getPublicResource(){
     return "This is successful string";
 }
}

4. 应用启动类代码

package com.example.wardemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class WardemoApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(WardemoApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WardemoApplication.class);
    }
}

操作步骤

执行maven clean和maven package生成WAR包,重命名为apk.war后部署到Tomcat服务器。

日志信息

  • 访问日志显示多次访问/api/getpublicresource返回404;
  • catalina日志显示部署时出现java.io.IOException: The device is not ready错误,导致项目启动失败。

问题分析与解决方案

1. 先解决项目启动失败的核心问题

java.io.IOException: The device is not ready是导致404的根本原因,项目未启动自然无法访问API:

  • 检查Tomcat所在磁盘:确认磁盘未被占用、无坏道,Tomcat进程拥有读写webapps、work、temp目录的权限;
  • 清理Tomcat缓存:删除work和temp目录下的所有文件,避免缓存文件损坏影响部署;
  • 重新生成WAR包:执行mvn clean package时确保过程无报错,验证WAR包完整性,可解压查看内部文件是否齐全。

2. 修正配置文件错误

application.properties中的server..port=9998存在语法错误,多了一个点,应改为server.port=9998。虽然外部Tomcat会覆盖这个端口,但错误配置可能干扰项目启动。

3. 确认访问路径正确性

外部Tomcat的访问路径规则为:http://[Tomcat地址]:[Tomcat端口]/[WAR包名称]/[API路径]

  • 你的WAR包名为apk.war,Controller的API路径是/getpublicresource,所以正确访问地址是http://127.0.0.1:8282/apk/getpublicresource;
  • 日志中显示访问的是/api/getpublicresource,这里可能是路径拼写错误,若需统一前缀,可在application.properties中添加server.servlet.context-path=/api。

4. 检查版本兼容性

Spring Boot 3.0.5基于Jakarta EE 9,要求搭配Tomcat 10.x版本。如果你的外部Tomcat是9.x及以下,会导致部署失败。请确认Tomcat版本为10.x及以上。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:17:03