SpringBoot 应用程序在从 JAR 提供 JSP 时显示 Whitelabel 错误页面
Posted
技术标签:
【中文标题】SpringBoot 应用程序在从 JAR 提供 JSP 时显示 Whitelabel 错误页面【英文标题】:SpringBoot app shows Whitelabel Error Page while serving JSP from JAR 【发布时间】:2018-08-08 14:17:54 【问题描述】:我正在探索如何从 JAR 文件中提供 JSP。我正在使用 SpringBoot 1.5.10.RELEASE
我参考了this 和this 示例,并能够创建spring boot 应用程序
包括位置 src/main/resources/META-INF/resources/WEB-INF/jsp/ 的 JSP 视图解析器的前缀为 /WEB-INF/jsp/,后缀为 .jsp奇怪的是,当我将项目作为 springboot 应用程序或 Java 应用程序运行时,我能够点击控制器并获得所需的 JSP 文件作为响应。之后我想打包应用程序,然后从 JAR 中运行它。
$ mvn package
$ java -jar target/springboot-web-jar-demo-0.0.1-SNAPSHOT.jar
Spring boot 应用程序出现,当我点击相同的 URL 模式时,控制进入映射方法,但之后......
白标错误页面
此应用程序没有显式映射 /error,因此您将其视为后备。
2018 年 2 月 28 日星期三 21:01:09 IST 出现意外错误(类型=未找到,状态=404)。 /WEB-INF/jsp/index.jsp
我的问题/疑问...
springboot 应用在 IDE 中运行与作为 JAR 运行时是否有任何重大区别,甚至会导致 404? spring boot 1.5.10.RELEASE 是否支持从 JAR 提供 JSP? (如果是,那么我在这里缺少什么,如果不是,那么在哪里提到)-***-link我已尝试寻找合适的解决方案或答案来解决我的问题,但没有得到任何答案。因此在这里发布问题请帮助。
注意:
请不要为WAR打包提供解决方案 我知道现在 JSP 不是最好的选择,我只是在学习 我知道我可以寻找 thymeleaf、freemarker 和 velocity 等替代品 我不想降级 SpringBoot 版本 我也尝试将 jasper 和 JSTL 的<scope>
指定为 provided
和 compile
,但没有成功
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atuldwivedi.learn.springboot</groupId>
<artifactId>springboot-web-jar-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot-web-jar-demo</name>
<description>Learn how to serve JSP from JAR</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath />
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
【问题讨论】:
欢迎批评,您可以对问题投反对票,但请分享您的想法,为什么这样做...谢谢! 【参考方案1】:为了让 spring boot 识别他们的 jsps,你需要在 src.main 中创建一个 webapp 目录,如下所示:
src/main/webapp/WEB-INF/jsp
而不喜欢:
src/main/resources/META-INF/resources/WEB-INF/jsp
【讨论】:
您的答案适用于<packaging>war</packaging>
,但不适用于<packaging>jar</packaging>
。我已经明确提到我正在做 JAR 部署。
所以尝试添加到 pom.xml: servlet-api
依赖。
我在heroku 有一个带有jsp 的maven 项目spring boot,用jar 部署,不管你想要它,告诉我上传到github
抱歉延迟回复,我出站了,请将你的工作项目上传到 GitHub,我会 fork 看看。谢谢!【参考方案2】:
为了让 dispatcherServelet 识别他们的 jsps,你在 src.main 中创建一个 webapp 目录,如下所示:
src/main/webapp/WEB-INF/jsp 并在 application.properties 中自动配置您的应用程序 spring.mvc.view.prefix:/WEB-INF/jsp spring.mvc.view.suffix:.jsp`
【讨论】:
【参考方案3】:使用可执行 jar 时不支持 JSP。
【讨论】:
你不能这么说。因为他使用的是 spring 框架,所以可以使用嵌入式 tomcat。因此,您的回答无济于事,也不正确。以上是关于SpringBoot 应用程序在从 JAR 提供 JSP 时显示 Whitelabel 错误页面的主要内容,如果未能解决你的问题,请参考以下文章
Gradle + Nexus 管理Spring Boot的Jar