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

pau*_*aul 6 spring-boot

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

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

当我在 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 上下文按预期获得它们。

有任何想法吗?

And*_*son 4

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

  1. classpath:/META-INF/resources/
  2. classpath:/resources/
  3. classpath:/static/
  4. classpath:/public/

3 可以让你的资源变得src/main/resources/static可用。

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

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