tomcat访问SpringBoot war包404
给点耐心看,可能根本问题就是你漏掉了一个细节。问题分析项目由架构:Springboot 版本2.4.5jdk版本11.0.11tomcat版本10.0.6jsp版本9.0.46将SpringBoot以war方式打包,启动tomcat之后访问项目地址,报404错误,404代表访问的地址不存在,所以别想得太复杂,简单的理解就是tomcat无法访问到你的项目指定的路径,没有找到这个东西。问题排查首先附上
给点耐心看,可能根本问题就是你漏掉了一个细节。
问题分析
项目由架构:
Springboot 版本2.4.5
jdk版本11.0.11
tomcat版本10.0.6
jsp版本9.0.46
将SpringBoot以war方式打包,启动tomcat之后访问项目地址,报404错误,404代表访问的地址不存在,所以别想得太复杂,简单的理解就是tomcat无法访问到你的项目指定的路径,没有找到这个东西。
问题排查
首先附上我的项目目录结构
1)如果项目有用到jsp,那么首先在application.properties配置视图解析器。
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp
之后在pom.xml配置jsp依赖。
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
指定jsp编译后的路径,这个路径是指定格式。
<resource>
<directory>src/main/webapp</directory>
<targetPath>META-INF/resources</targetPath>
<includes>
<include>*.*</include>
</includes>
</resource>
这样jsp的配置就完成了。
2)SpringBoot启动类,必须继承一个SpringBootServletInitializer,然后重写configure方法,目的是为当前这个SpringBoot启动类构建新资源。我这里项目创建的时候生成了一个ServletInitializer,所以直接继承ServletInitializer即可。如果你的项目没有ServletInitializer这个类,则手继承
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SpringbootWarProjectApplication.class);
}
}
3)打包war,如果你的项目默认是jar的方式,需要把配置修改成war的打包方式,在pom.xml增加war配置。
指定打包方式为war
指定打包后的文件名称为springboot,这里随意。
4)运行mvn clean package打包项目
可以看到target目录下面有个springboot.war包,这个就是我们需要的包。
5)我这里分别对tomcat三个版本做测试。
发现均访问404
原地升天
别急,稳住,上面的配置肯定不会有问题。
6)这个问题很明显是tomcat访问不到java资源,我们到官网看看版本兼容。
tomcat 版本8.5.x对应java 7 and later ,支持java7及更高版本
tomcat 版本 9.0.x对应java 8 and later,支持java8及更高版本
tomcat 版本 10.0.x对应java 8 and later,支持java8及更高版本
这样一看我的,java 11版本是没有问题的。
但是启动tomcat的时候,明显没有spring的logo,说明spring根本没有启动成功,也就是tomcat启动spring没有成功,归根到底还是兼容问题,于是我手动将java 版本修改成tomcat支持的最低版本,也就是java 8的版本。
7)重新打包运行,再次启动。
我用tomcat 9.0.46的版本重新运行之后,可以看到spring大大的logo,
打开网页访问localhost:8090/springboot。别问为什么我的端口是8090,问就是我自己修改的。
启动成功,所以为什么是这个页面,别急这个只是路径错误而已,至少我们的tomcat是可以访问到我们的springboot项目了。
来个正确姿势。
到这里问题基本就解决了,一定要注意兼容问题。
值得研究的是,我这里测试了三个tomcat的版本,只有10.0.6的版本依旧不能访问,其余的两个版本都没有问题,这里我们也不必纠结了,直接使用其它两个版本中的一个就行了。
end
更多推荐
所有评论(0)