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
相关产品推荐
相关产品推荐

