spring-boot - 内嵌Tomcat,可执行jar,ServletContext.getRealPath()

标签 spring-boot

我正在使用标准的 Spring Boot 方法(一个 Java 项目),其中我们使用嵌入式 Tomcat 和包作为可执行 jar。

我放置了一些静态资源,例如 index.htmlsrc/main/resources 下的静态文件夹中我的项目。我们使用的库期望通过执行 servletContext.getRealPath("XXXX") 使用 servlet 上下文加载一些资源。 .

当我在 Eclipse 中运行这个项目时,servletContext.getRealPath("/") 的真实路径解析为 C:\Users\<me>\workspace\springboot-project\src\main\webapp\ .我不知道为什么它在项目中不存在时使用这个文件夹?如果我创建可执行 jar 并运行它,那么 servletContext.getRealPath("/")C:\Users\<me>\AppData\Local\Temp\tomcat-docbase.5693809153072003983.8080\ .这个目录确实存在,但里面什么都没有。

如果通过 HTTP 请求,我显然可以很好地看到我的资源,但我无法通过 servlet 上下文按预期获得它们。

有任何想法吗?

最佳答案

资源在src/main/resources/static Tomcat 不直接提供服务。它们由 Spring 通过其 DispatcherServlet 和 ResourceHttpRequestHandler 提供服务。这是由 Spring Boot 自动配置的。默认情况下,此资源处理程序配置为从以下位置提供资源:

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/

  • 是 3 使您的资源进入 src/main/resources/static可用的。

    使用 getRealPath()总是会出现问题,因为它要求资源作为文件系统上的文件可用,即它不能在您正在运行的 war 或 jar 中,并且不能保证会是这种情况。使用 ClassLoader.getResource()ServletContext.getResource()是一种在 Web 应用程序中查找和加载资源的更强大的方法,因为它不依赖于直接位于文件系统上的资源。

    您还没有说明使用的是哪个库 getRealPath() .也许它可以更新或配置为使用不同的资源加载策略?

    关于spring-boot - 内嵌Tomcat,可执行jar,ServletContext.getRealPath(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26849636/

    相关文章:

    java - 配置嵌入式 MongoDB 的最简单方法

    java - Spring Boot 1.2.5.RELEASE @Transaction

    java - 如何在 Spring Mail Integration 中启用 IMAPFolder 读写模式

    java - Spring 上下文中未加载 Spring Boot 全局 Controller 建议

    java - 如何在 Spring Boot Rest API 中的 BeanUtils.copyProperties 期间从 String 转换为 enum

    spring-boot - Redis put() 语句中使用的键和散列键参数有什么区别?

    java - Spring Boot 应用程序未在现有 tomcat 上完全启动

    amazon-web-services - 使用 AWS Elastic Beanstalk 在 AWS 上部署 Spring Boot 应用程序

    json - spring-boot json 根名称

    spring-boot - Spring Cloud 侦探是如何工作的?