​ 本文介绍使用idea 2023在SpringBoot 2.7.18环境下,如何解决在使用getServletContext().getRealPath()将一个相对于当前web应用的路径转换为物理文件系统上的绝对路径时获取到的却是虚拟路径问题,即可通过配置IDEA的工作区和创建public文件夹来稳定文件存储路径。

1. 问题

  • 使用tomcat容器。

  • 使用getServletContext().getRealPath()转化web应用路径。

  • 得到的是c盘临时文件路径。

  • 每次开发运行,临时文件路径动态变更。

  • 虚拟路径类似:

    C:\Users\UserName\AppData\Local\Temp\tomcat-docbase.8080.2388555695500642400

2. 原理

(1)run时,tomacat容器加载时通过getValidDocumentRoot方法获取路径。

img

(2)默认获取commonDocRoot中配置的三个目录。

img

(3)如果路径不存在,将会创建临时路径

img

(4)程序当中通过ServletContext上下文getRealPath获取项目路径时得到的将会是c盘下虚拟路径,例如:

C:\Users\UserName\AppData\Local\Temp\tomcat-docbase.8080.2388555695500642400

3. 解决措施

(1)在idea的运行配置中配置项目工作区,点击Modify options

img

(2)选中工作目录

img

(3)配置工作目录

img

(4) 工作目录下创建public文件夹

img

(5)此时通过getRealPath可获取到正确的项目所在物理文件系统绝对路径。