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> 指定为 providedcompile,但没有成功

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

【讨论】:

您的答案适用于&lt;packaging&gt;war&lt;/packaging&gt;,但不适用于&lt;packaging&gt;jar&lt;/packaging&gt;。我已经明确提到我正在做 JAR 部署。 所以尝试添加到 pom.xml: javax.servletservlet-api2.5提供 这也行不通。理想情况下,如果使用了 embeded-tomcat,我们不应该提供 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 错误页面的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot的 maven 插件

SpringBoot启动jar包时设置临时属性

Gradle + Nexus 管理Spring Boot的Jar

springboot创建一个可执行的jar

面试官:为什么 SpringBoot 的 jar 可以直接运行?

面试官:为什么 SpringBoot 的 jar 可以直接运行?