关于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>
相关推荐
qqty1217几秒前
Spring Boot管理用户数据
java·spring boot·后端
bearpping1 小时前
SpringBoot最佳实践之 - 使用AOP记录操作日志
java·spring boot·后端
一叶飘零_sweeeet1 小时前
线上故障零扩散:全链路监控、智能告警与应急响应 SOP 完整落地指南
java·后端·spring
开心就好20252 小时前
不同阶段的 iOS 应用混淆工具怎么组合使用,源码混淆、IPA混淆
后端·ios
架构师沉默2 小时前
程序员如何避免猝死?
java·后端·架构
椰奶燕麦2 小时前
Windows PackageManager (winget) 核心故障排错与通用修复指南
后端
zjjsctcdl3 小时前
springBoot发布https服务及调用
spring boot·后端·https
zdl6863 小时前
Spring Boot文件上传
java·spring boot·后端
世界哪有真情3 小时前
哇!绝了!原来这么简单!我的 Java 项目代码终于被 “拯救” 了!
java·后端
RMB Player3 小时前
Spring Boot 集成飞书推送超详细教程:文本消息、签名校验、封装工具类一篇搞定
java·网络·spring boot·后端·spring·飞书