关于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>
相关推荐
武子康4 小时前
大数据-89 Spark应用必备:进程通信、序列化机制与RDD执行原理
大数据·后端·spark
shark_chili4 小时前
JITWatch实战指南:深入Java即时编译优化的黑科技工具
后端
绝无仅有4 小时前
从拉取代码到前端运行访问:Vue 前端项目的常规启动流程
后端·面试·github
小蒜学长4 小时前
spring boot驴友结伴游网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
CodeLongBear4 小时前
深入理解 JVM 字节码文件:从组成结构到 Arthas 工具实践
java·jvm·后端
IT_陈寒5 小时前
SpringBoot 3.x实战:5种高并发场景下的性能优化秘籍,让你的应用快如闪电!
前端·人工智能·后端
Victor3565 小时前
Redis(47)如何配置Redis哨兵?
后端
Victor3565 小时前
Redis(46) 如何搭建Redis哨兵?
后端
尘鹄10 小时前
go 初始化组件最佳实践
后端·设计模式·golang
墩墩分墩10 小时前
【Go语言入门教程】 Go语言的起源与技术特点:从诞生到现代编程利器(一)
开发语言·后端·golang·go