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

时间:2021-02-04 22:45:57

标签: java tomcat

我已阅读 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 窗口执行 set -Djava.io.tmpdir=C:\Temp 并且仍然得到相同的结果。

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

<块引用>

“我也尝试从 cmd 窗口执行 set -Djava.io.tmpdir=C:\Temp 并且仍然得到相同的结果。”

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

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

另一方面,如果您希望您的网络应用程序使用(例如)“C:\Temp”来处理某些的事情,同时仍然让网络容器的其余部分使用 {{1}其余的,您的 webapp 代码可以使用(例如)

java.io.tmpdir

代替

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

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


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

相关问题