为什么spring boot 1.5.3 jar无法识别src / main / resources / META-INF / resources /中的jsp文件

时间:2017-06-22 03:46:40

标签: jsp spring-boot

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

  

幸运的是,我们为Jar项目提供了另一个选项:Servlet 3.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不支持在src/main/resources/META-INF/resources/中放置jsp文件?

2 个答案:

答案 0 :(得分:1)

跟踪源代码后,我发现为什么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的源代码复制到您的类路径 enter image description here

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);
}

答案 1 :(得分:0)

从版本1.4.3开始,对于spring-boot-maven-plugin,不再加载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>

您可以在此处找到示例:https://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-exploded-war.html