小编典典

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

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

有任何想法吗?


阅读 737

收藏
2020-05-30

共1个答案

小编典典

src/main/resources/staticTomcat并不直接提供其中的资源。Spring通过其DispatcherServlet为它们提供服务ResourceHttpRequestHandler,Spring
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()或是ServletContext.getResource()在Web应用程序中查找和加载资源的更可靠的方法,因为它不依赖于资源直接依赖于文件系统。

您尚未说明正在使用哪个库getRealPath()。也许可以对其进行更新或配置为使用其他资源加载策略?

2020-05-30