System.getProperty("java.io.tmpdir") 没有返回正确的位置

System.getProperty("java.io.tmpdir") not returning correct location

我已阅读 this post 并确定将 TEMP 和 TMP 的系统变量和用户变量分别设置为 C:\Temp 和 C:\tmp。我已经重新启动了我的机器两次,但是当我的应用程序调用 System.getProperty("java.io.tmpdir") 时,它一直指向 C:\Program Files\Apache Software Foundation\Tomcat 8.5\temp。为什么要这样做,我怎样才能让它指向 C:\Temp 或 C:\tmp? TIA

编辑:
我也尝试从 cmd window 执行 set -Djava.io.tmpdir=C:\Temp,但仍然得到相同的结果。

在 Tomcat 安装目录的 bin\catalina.bat 中有以下几行:

if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
set "CATALINA_TMPDIR=%CATALINA_BASE%\temp"
:gotTmpdir

您可以设置环境变量 CATALINA_TMPDIR 或修改此文件。

"I have also tried doing set -Djava.io.tmpdir=C:\Temp from the cmd window and am still getting the same results."

Tomcat 本身正在将 System 属性中的 java.io.tmpdir 属性 设置为任何 CATALINA_TMPDIR environment 变量设置为。这发生在 Tomcat 启动期间,它会覆盖您的 -D 设置。

所以简单的解决方案是(如 中所述) 或者 在 Tomcat 所在的环境中设置 CATALINA_TMPDIR已启动,修改catalina.bat文件(或Linux上的catalina.sh文件)。前者会更可取。如果可以,最好保持 Tomcat 安装树“原始”。

另一方面,如果您希望您的 webapp 使用(比如)“C:\Temp”来处理某些 事情,同时仍然让其余的 web 容器使用java.io.tmpdir 其余的,你的 webapp 代码可以使用(例如)

Files.createTempFile(Path dir, String prefix, String suffix,
                     FileAttribute<?>... attrs) 

而不是

Files.createTempFile(String prefix, String suffix, 
                     FileAttribute<?>... attrs)

告诉 创建临时文件时要使用的临时目录。 (如果临时文件是在第 3 方代码中创建的,那可能会很尴尬。)


最后要注意的一件事是,如果您 运行 Tomcat 在启用了强制执行的 SELinux 系统上,则 Tomcat 服务(默认)限制在它可以读取和写入文件的位置。如果您打算使用替代的“临时”位置,您可能需要调整 SELinux 策略内容。