【问题标题】:WEB-INF not included in WebApp using SpringBoot, Spring-MVC and MavenWEB-INF 不包含在使用 SpringBoot、Spring-MVC 和 Maven 的 WebApp 中
【发布时间】:2019-03-11 05:58:32
【问题描述】:

我有一个使用 Maven 构建的 Spring-MVC 的 web 应用程序。当我生成 JAR 文件时,应用程序启动得很好。控制器正在执行,但是当我到达这部分时:

@RequestMapping(value = "/test-block", method = RequestMethod.GET)
public ModelAndView block(Model model) {
    return new ModelAndView("templates/test-block");
}

我收到此错误:

There was an unexpected error (type=Not Found, status=404).
/WEB-INF/templates/test-block.jsp

请注意,在 IDE 中调试或运行可以正常工作。

我的文件夹:

src
|--main
   |--java
      |--com.xxx // sources
      webapp
      |--WEB-INF
         |--templates
            |--*.jsp // jsp files
      resources
      |--application.properties

我的应用程序属性:

spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp

我检查了生成的 JAR 文件,但在任何地方都看不到 WEB-INF。

编辑:

pom 文件:

    <packaging>war</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

【问题讨论】:

  • 你不应该生成一个 .war 文件吗?
  • 我想要一个独立的 jar 文件。但尝试做一个战争文件,现在该文件夹已包含在内。奇怪
  • 使用返回简单字符串值(视图名称)的请求映射器或在ModelAndView对象的构造函数中设置模型名称和值。
  • 单个 jar 文件不是独立的 Web 应用程序。只是一个模块,如果您将它们包含在打包到 WAR/EAR 文件中的 Web 应用程序的类路径中,您可以在 Web 应用程序中重用它。
  • @TheBitman 是的,Spring Boot 应用程序通常捆绑为单个 jar 文件,其中包含嵌入式 Web 服务器。

标签: java maven spring-mvc spring-boot


【解决方案1】:

您应该为 Web 应用程序创建 .war 而不是 .jar,您将看到 WEB-INF 文件夹。

也改变

spring.mvc.view.prefix=/WEB-INF/spring.mvc.view.prefix=/WEB-INF/templates

ModelAndView("templates/test-block")ModelAndView("test-block") 以解决 404 错误。

【讨论】:

  • modelAndView 确实在工作。我得到了 404,因为 JAR 中没有包含 WEB-INF,所以缺少 test-block.jsp。创建了一个 WAR,现在所有文件都包含在内。谢谢!
【解决方案2】:

参考 serving static content 上的 Spring Boot 文档。

注意:

默认情况下,Spring Boot 从名为 /static(或 /public 或 /resources 或 /META-INF/resources)在 类路径或来自 ServletContext 的根。它使用 来自 Spring MVC 的 ResourceHttpRequestHandler 以便您可以修改它 通过添加您自己的 WebMvcConfigurer 并覆盖 addResourceHandlers 方法。

...

您还可以使用 spring.resources.static-locations 属性(替换默认 带有目录位置列表的值)。

...

如果您的应用程序是,请不要使用 src/main/webapp 目录 包装成罐子。虽然这个目录是一个通用标准,但它 仅适用于战争包装,并且被大多数人默默忽略 如果您生成 jar,则构建工具。

所以,您看到的是预期的行为。您可以将模板移动到预期位置之一、自定义默认位置或使用 war 打包。

【讨论】:

    【解决方案3】:

    Spring boot 为网页寻找资源文件夹。 Webapp 文件夹不在 Spring Boot 应用程序的类路径中。您需要使用 maven 插件将您的 webapp 文件夹复制到 jar/war 文件中。 它可以在 IDE 中工作,因为它知道在哪里可以找到网页。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-04
      • 2018-02-24
      • 2010-12-24
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      相关资源
      最近更新 更多