需单独配置CATALINA_TMPDIR,因其默认指向%CATALINA_BASE%\temp,易因系统盘限制、杀毒软件拦截、多实例冲突或权限问题导致上传失败、JSP编译报错;必须设为真实可写的绝对英文路径,且建议按实例隔离。

为什么需要单独配置 CATALINA_TMPDIR
Tomcat 默认把临时文件(如上传的 multipart 文件、JSP 编译中间产物、解压的 WAR 包内容)写到 %CATALINA_BASE%\temp。但这个路径可能落在系统盘(比如 C:\),或者被杀毒软件/组策略拦截,导致上传失败、JSP 编译报错、甚至启动卡在「Initializing Spring DispatcherServlet」。单独配 CATALINA_TMPDIR 是为了把临时 I/O 移出敏感路径,同时避免和多个 Tomcat 实例共用 temp 目录引发冲突。
CATALINA_TMPDIR 必须指向一个真实可写的空目录
它不是路径模板,也不能是相对路径或环境变量嵌套表达式(比如 %CATALINA_BASE%\temp 在某些 Windows 批处理版本中会解析失败)。常见错误包括:
- 变量值填成
%CATALINA_BASE%\temp却没确认CATALINA_BASE已正确定义 - 路径含中文、空格或特殊符号(如
D:\My Temp\),导致startup.bat解析异常 - 目录不存在,或当前用户无写权限(尤其在服务模式下以 LocalSystem 运行时)
- 指向了只读网络盘或 OneDrive 同步目录(同步锁会导致文件创建失败)
正确做法是:手动新建一个纯英文路径的空文件夹,例如 D:\tomcat-temp,再将该绝对路径设为 CATALINA_TMPDIR 的值。
Windows 下设置 CATALINA_TMPDIR 的实操要点
必须在「系统变量」里新建,不能放在用户变量;且需重启命令行窗口才能生效。步骤如下:
- 右键「此电脑」→「属性」→「高级系统设置」→「环境变量」
- 在「系统变量」区域点击「新建」
- 变量名填
CATALINA_TMPDIR,变量值填类似D:\tomcat-temp的绝对路径(结尾不加反斜杠) - 确认保存后,**关闭所有已打开的 cmd / PowerShell 窗口**,再新开一个,运行
echo %CATALINA_TMPDIR%验证是否输出正确路径 - 启动 Tomcat 后,检查
logs/catalina.out是否还有java.io.IOException: Permission denied或java.lang.IllegalStateException: Unable to create temporary file类错误
与 CATALINA_BASE 和 CATALINA_HOME 的关系
CATALINA_TMPDIR 是独立变量,不依赖 CATALINA_BASE —— 即使你没设 CATALINA_BASE,只要设了它,Tomcat 就会优先使用它。但如果你用了多实例部署(即 CATALINA_BASE 指向不同工作目录),CATALINA_TMPDIR 仍建议按实例隔离,比如:
- 实例 A:
CATALINA_BASE=D:\tomcat-instance-a→CATALINA_TMPDIR=D:\tomcat-instance-a\temp - 实例 B:
CATALINA_BASE=D:\tomcat-instance-b→CATALINA_TMPDIR=D:\tomcat-instance-b\temp
否则多个实例往同一临时目录写文件,可能因并发清理或文件锁导致 JSP 编译失败或上传中断——这点最容易被忽略。

















