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

时间:2014-11-10 17:40:03

标签: spring-boot

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

我将一些静态资源(例如index.html)放在我项目的src/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上下文按预期获取它们。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

  1. classpath:/META-INF/resources/
  2. classpath:/resources/
  3. classpath:/static/
  4. classpath:/public/
  5. 这是让你的资源在src/main/resources/static可用。

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

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