关于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>
相关推荐
Filotimo_3 小时前
SpringBoot3入门
java·spring boot·后端
一 乐4 小时前
校园墙|校园社区|基于Java+vue的校园墙小程序系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·小程序
golang学习记4 小时前
🍵 Go Queryx 入门指南:让数据库操作像喝奶茶一样丝滑!
后端
z_鑫4 小时前
Java线程池原理深度解析
java·开发语言·后端
华仔啊5 小时前
MyBatis-Plus 不只是简化CRUD!资深架构师总结的15个高阶用法
java·后端·mybatis
吴名氏.5 小时前
电子书《ASP.NET MVC企业级实战》
后端·asp.net·mvc·编程语言
IT_陈寒6 小时前
SpringBoot 3.2新特性实战:这5个隐藏技巧让你的应用性能飙升50%
前端·人工智能·后端
小奏技术6 小时前
LLM 交互的“省钱”新姿势:JSON 已死,TOON 当立
后端·aigc
用户21411832636026 小时前
mcp-server案例分享-即梦MCP-Server实战教程-让Claude直接调用AI生图视频能力
后端