为什么SpringBoot1.5.3JAR不能识别src/main/resources/META-INF/resources中的jsp文件/

为什么SpringBoot1.5.3JAR不能识别src/main/resources/META-INF/resources中的jsp文件/,jsp,spring-boot,Jsp,Spring Boot,我使用了SpringBoot+jsp,我想构建一个可执行的jar,正如前面指出的,只需要将jsp文件放入src/main/resources/META-INF/resources/ 幸运的是,Jar项目还有另一个选项:Servlet3.0规范允许在src/main/resources/META-INF/resources/ 但不幸的是,我无法成功访问jsp页面。在尝试了很长一段时间后,我最终决定将spring boot starter web 1.5.3.RELEASE更改为1.4.2.RELE

我使用了SpringBoot+jsp,我想构建一个可执行的jar,正如前面指出的,只需要将jsp文件放入
src/main/resources/META-INF/resources/

幸运的是,Jar项目还有另一个选项:Servlet3.0规范允许在src/main/resources/META-INF/resources/

但不幸的是,我无法成功访问jsp页面。在尝试了很长一段时间后,我最终决定将spring boot starter web 1.5.3.RELEASE更改为
1.4.2.RELEASE
,与此演示后一样,这次它可以正常工作


那么为什么sprint boot 1.5.3不支持将jsp文件放入
src/main/resources/META-INF/resources/

在跟踪源代码之后,我发现了为什么1.5.3无法识别jsp文件

Spring boot 1.4.2

//org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.StoreMergedWebXmlListener#onStart
private void onStart(Context context) {
    ServletContext servletContext = context.getServletContext();
    if(servletContext.getAttribute("org.apache.tomcat.util.scan.MergedWebXml") == null) {
        servletContext.setAttribute("org.apache.tomcat.util.scan.MergedWebXml", this.getEmptyWebXml());
    }

    TomcatResources.get(context).addClasspathResources(); // only 1.4.2 has this line 
}
Spring boot 1.5.3

    private void onStart(Context context) {
        ServletContext servletContext = context.getServletContext();
        if (servletContext.getAttribute(MERGED_WEB_XML) == null) {
            servletContext.setAttribute(MERGED_WEB_XML, getEmptyWebXml());
        }
    }
如何让spring boot 1.5.3也像1.4.2一样工作?以下是我的态度:

1.将
TomcatEmbeddedServletContainerFactory的源代码复制到类路径

2.修改
onStart
方法

private void onStart(Context context) {
    ServletContext servletContext = context.getServletContext();
    if (servletContext.getAttribute(MERGED_WEB_XML) == null) {
        servletContext.setAttribute(MERGED_WEB_XML, getEmptyWebXml());
    }
    // add below code    
    List<URL> list = new ArrayList<>();
    String file = "file:/Users/zhugw/workspace/boot-jar-serving-jsp/boot-jar-serving-jsp-1.0-SNAPSHOT.jar!/";
    try {
        URL jar = new URL("jar", null, file);
        list.add(jar);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    TomcatResources.get(context).addResourceJars(list);
}
private void onStart(上下文){
ServletContext=context.getServletContext();
if(servletContext.getAttribute(合并的WEB\uxml)==null){
setAttribute(合并的WEB XML,getEmptyWebXml());
}
//添加以下代码
列表=新的ArrayList();
String file=“file:/Users/zhugw/workspace/boot-jar-service-jsp/boot-jar-service-jsp-1.0-SNAPSHOT.jar!/”;
试一试{
URL jar=新URL(“jar”,null,文件);
添加(jar);
}捕获(格式错误){
e、 printStackTrace();
}
TomcatResources.get(上下文).addResourceJars(列表);
}

从spring boot maven插件的1.4.3版开始,不再加载jsp文件。要解决此问题,请使用:

<build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>1.4.2.RELEASE</version>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

org.springframework.boot

需要明确的是,如果您遵循本文,它会告诉您将视图放入
src/main/resources/META-INF/resources/*WEB-INF/views*
和设置
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
。你做到了吗?或者您只是将jsp文件放在
src/main/resources/META-INF/resources
中?当然我知道这些。您可以下载演示并修改spring引导版本以证明这是将JSP与嵌入式容器一起使用的一个限制。看见在将应用程序作为war部署到servlet容器时,您所描述的(以及链接到的)是默认设置!