我正在使用标准的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上下文按预期获取它们。
有什么想法吗?
答案 0 :(得分:3)
Tomcat不直接提供src/main/resources/static
中的资源。它们由Spring通过其DispatcherServlet和由Spring Boot自动配置的ResourceHttpRequestHandler
提供服务。默认情况下,此资源处理程序配置为从以下位置提供资源:
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
这是让你的资源在src/main/resources/static
可用。
使用getRealPath()
总是会有问题,因为它需要资源作为文件系统上的文件提供,即它不能在你正在运行的战争或jar中,并且没有保证会出现这种情况。使用ClassLoader.getResource()
或ServletContext.getResource()
是一种更加健壮的方法,可以在Web应用程序中查找和加载资源,因为它不依赖于直接在文件系统上的资源。
你还没有说过哪个库正在使用getRealPath()
。也许它可以更新或配置为使用不同的资源加载策略?