关于SpringBoot打包war部署到IDEA外的Tomcat访问404的解决

前言

在学习SpringBoot+JSP打包成war部署到IDEA外,打开Tomcat的时候访问这个打包的项目,404

访问这个项目的地址的时候,有个index.jsp页面,是可以访问的 但是Controller层是没办法访问的,访问就报404

java 复制代码
package com.powernode.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class JspController {
    @RequestMapping("/main")
    public String main(Model model){
        model.addAttribute("data", "SpringBoot打包为war文件");
        return "index";
    }

    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){
        return "hello这个是直接返回的不是返回到视图层的";
    }
}

原因有很多

  1. Application配置类,没有继承SpringBootServletInitializer并且重写configure方法
  2. 少写了某个注解
  3. 如果在IDEA中SpringBoot的Tomcat插件和IDEA中的独立的Tomcat都可以运行,但是在打包成war就运行不了了,可以查看独立的Tomcat运行版本是多少 这里主要看Tomcat的版本和JDK的版本

Tomcat的版本和JDK的版本都必须一致,我当前用的是Tomcat9,如果用10的话版本问题更多

如果电脑里(不是IDEA)有多个Tomcat,实际上的环境变量配置应该都只有一个,所以无论启动哪个Tomcat中bin目录下的startup.bat都是启动的环境变量配置好的那个Tomcat,所以这个版本要保证是和打包时候的版本是一致的

JDK我用17的时候是404,换了1.8好了,JDK的版本也是根据环境变量进行配置的,也必须要一致

  1. 还有pom.xml配置的问题 要在spring-boot-starter-web中,排除Tomcat避免冲突
xml 复制代码
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<!--排除Tomcat的代码-->
	<exclusions>
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
		</exclusion>
	</exclusions>
</dependency>

需要加入Servlet依赖

xml 复制代码
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>3.1.0</version>
	<scope>provided</scope>
</dependency>

文件生成的目录

xml 复制代码
<build>
		<!--打包后的文件名称-->
		<finalName>newboot</finalName>

		<!--resources插件,把jsp编译到指定的目录-->
		<resources>
			<resource>
				<directory>src/main/webapp</directory>
				<targetPath>META-INF/resources</targetPath>
				<includes>
					<include>**/*.*</include>
				</includes>
			</resource>

			<!--使用mybatis,而且mapper文件放在src/main/java目录-->
			<resource>
				<directory>src/main/java</directory>
				<includes>
					<include>**/*.xml</include>
				</includes>
			</resource>

			<!--把src/main/resources下面的所有文件,都包含到classes目录-->
			<resource>
				<directory>src/main/resources</directory>
				<includes>
					<include>**/*.*</include>
				</includes>
			</resource>
		</resources>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
  1. 重点是如果JDK是1.8的话使用SpringBoot3.0的话,也会报错,所以我这里用的是
xml 复制代码
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.7.6</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

主要

主要就是开发环境的各种版本和打包以后运行的版本要一致,打包成war的时候,一定要先使用独立的Tomcat在IDEA中运行一遍,并且记录一下Tomcat启动时候的各种配置IDE版本

打包成war之前一定要清理一下再重新打包 如果不清楚打包以后项目的名称可以使用jsp页面通过

javascript 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index.jsp</title>
</head>
<body>
     <h3>项目的contextPath:${pageContext.request.contextPath}<h3/>
</body>
</html>
相关推荐
止语Lab2 小时前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活2 小时前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
程序员天天困2 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn2 小时前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
用户298698530142 小时前
Python 实现 Excel 与 Markdown 互转的实用指南
后端·python·excel
用户77283104908402 小时前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端
Conan在掘金2 小时前
鸿蒙报错速查:Function lacks ending return statement,返回路径漏 return 就炸,根因 + 真解法
后端
人间凡尔赛2 小时前
AI-Native 云原生架构:2026 年从容器编排到智能体编排的范式革命
后端·云原生·架构
IT_陈寒3 小时前
Vue的响应式让我加班到凌晨3点,原来问题出在这
前端·人工智能·后端
卷无止境3 小时前
提升 Python 代码健壮性的方法大盘点
后端·python