前言
在学习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这个是直接返回的不是返回到视图层的";
}
}
原因有很多
- Application配置类,没有继承SpringBootServletInitializer并且重写configure方法
- 少写了某个注解
- 如果在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的版本也是根据环境变量进行配置的,也必须要一致
- 还有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>
- 重点是如果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>