嵌入式Tomcat,可执行jar,Servlet上下文.getRealPath()



我使用的是标准的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提供服务。默认情况下,此资源处理程序配置为从以下位置提供资源:

  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()。也许它可以更新或配置为使用不同的资源加载策略?

最新更新