我正在使用标准的 Spring Boot 方法(一个 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 上下文按预期获得它们。
有任何想法吗?
最佳答案
资源在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/