我使用的是标准的spring-boot方法(一个Java项目),其中我们使用嵌入式Tomcat并将其打包为可执行jar。
我将一些静态资源(例如index.html
)放在项目的src/main/resources
下的静态文件夹中。我们使用的库期望通过执行servletContext.getRealPath("XXXX")
来使用servlet上下文加载一些资源。
当我在Eclipse中运行这个项目时,servletContext.getRealPath("/")
的实际路径解析为C:Users<me>workspacespringboot-projectsrcmainwebapp
。我不知道为什么它在项目中不存在的情况下使用这个文件夹?如果我创建了可执行jar并运行它,那么servletContext.getRealPath("/")
会给出C:Users<me>AppDataLocalTemptomcat-docbase.5693809153072003983.8080
。这个目录确实存在,但里面什么都没有。
很明显,如果通过HTTP请求,我可以很好地看到我的资源,但我无法通过servlet上下文获得预期的资源。
有什么想法吗?
Tomcat不直接为src/main/resources/static
中的资源提供服务。它们由Spring通过其DispatcherServlet和由Spring Boot自动配置的ResourceHttpRequestHandler
提供服务。默认情况下,此资源处理程序配置为从以下位置提供资源:
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
是3使您在src/main/resources/static
中的资源可用。
使用getRealPath()
总是会有问题,因为它需要资源作为文件系统上的文件可用,也就是说,它不能在您正在运行的war或jar中,而且不能保证会出现这种情况。使用ClassLoader.getResource()
或ServletContext.getResource()
是在web应用程序中查找和加载资源的一种更健壮的方法,因为它不依赖于直接位于文件系统上的资源。
你还没有说是哪个库在使用getRealPath()
。也许它可以更新或配置为使用不同的资源加载策略?