关于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>
相关推荐
姑苏洛言3 小时前
编写产品需求文档:黄历日历小程序
前端·javascript·后端
姑苏洛言3 小时前
搭建一款结合传统黄历功能的日历小程序
前端·javascript·后端
你的人类朋友3 小时前
🍃认识一下boomi
后端
苏三说技术4 小时前
MySQL的三大日志
后端
豌豆花下猫4 小时前
让 Python 代码飙升330倍:从入门到精通的四种性能优化实践
后端·python·ai
南雨北斗5 小时前
TP6使用PHPMailer发送邮件
后端
你的人类朋友5 小时前
🤔什么时候用BFF架构?
前端·javascript·后端
争不过朝夕,又念着往昔6 小时前
Go语言反射机制详解
开发语言·后端·golang
绝无仅有7 小时前
企微审批对接错误与解决方案
后端·算法·架构
Super Rookie7 小时前
Spring Boot 企业项目技术选型
java·spring boot·后端