我使用的是标准的Spring Boot方法(一个Java项目),其中我们使用嵌入式Tomcat并将其打包为可执行jar。
我将一些静态资源放置index.html在src/main/resources项目下的静态文件夹中。我们使用的库希望通过servlet上下文来加载某些资源servletContext.getRealPath("XXXX")。
index.html
src/main/resources
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\。该目录确实存在,但其中没有任何内容。
servletContext.getRealPath("/")
C:\Users\<me>\workspace\springboot- project\src\main\webapp\
C:\Users\<me>\AppData\Local\Temp\tomcat- docbase.5693809153072003983.8080\
如果通过HTTP请求,我显然可以看到我的资源很好,但无法通过servlet上下文按预期获得它们。
有任何想法吗?
src/main/resources/staticTomcat并不直接提供其中的资源。Spring通过其DispatcherServlet为它们提供服务ResourceHttpRequestHandler,Spring Boot自动配置了它们。默认情况下,此资源处理程序配置为从以下位置提供资源:
src/main/resources/static
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()
ClassLoader.getResource()
ServletContext.getResource()
您尚未说明正在使用哪个库getRealPath()。也许可以对其进行更新或配置为使用其他资源加载策略?