用于控制java.io.tmpdir的环境变量?

Zac*_*sch 98 java configuration environment-variables temp

我已经使用TMP环境变量来控制gcc写入临时文件的地方,但我似乎找不到java的createTempFile API 的等价物.

这样的环境变量是否存在?

del*_*ego 111

嗯 - 因为这是由JVM处理的,我稍微深入研究了OpenJDK VM源代码,认为OpenJDK可能做的事情模仿了Java 6及之前做过的事情.除了Windows之外,还有一种方法可以做到这一点.

Windows上,OpenJDK的get_temp_directory()函数调用Win32 API GetTempPath(); 这就是在Windows上,Java反映了TMP环境变量的价值.

LinuxSolaris上,相同的get_temp_directory()函数返回静态值/tmp/.

我不知道实际的JDK6是否遵循这些确切的约定,但是通过每个列出的平台上的行为,它们似乎都是这样.

  • 为了清楚起见,您正在查看的是本机代码,它在JVM创建系统属性对象时为"java.io.tmpdir"属性提供*默认值*.这将被(例如)"-Djava.io.tmpdir = ..."选项覆盖. (35认同)
  • @StephenC,是的,这就是重点 - OP正在寻找如何在没有自己设置的情况下设置属性的默认值(通过JVM的`-Djava.io.tmpdir`命令行选项),如果该默认值受环境值的影响.正如人们所观察到的那样,在Windows上它受到'TMP`环境变量的影响**,但不清楚其他操作系统是否存在某些未知变量.看起来似乎没有,至少我们对OpenJDK的了解. (6认同)
  • 很好的答案,但在Windows上`GetTempPath()`不受"TMP"环境变量的影响:http://msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx (4认同)
  • @Znik 确实可以与 `oracle-java8-jdk=8u102` (linux) 一起使用 (2认同)

Bry*_*yle 103

根据java.io.FileJava Docs

缺省临时文件目录由系统属性java.io.tmpdir指定.在UNIX系统上,此属性的默认值通常为"/ tmp"或"/ var/tmp"; 在Microsoft Windows系统上,它通常是"c:\ temp".调用Java虚拟机时,可以为此系统属性提供不同的值,但不保证对此属性的编程更改会对此方法使用的临时目录产生任何影响.

要指定java.io.tmpdirSystem属性,可以按如下方式调用JVM:

java -Djava.io.tmpdir=/path/to/tmpdir
Run Code Online (Sandbox Code Playgroud)

默认情况下,此值应来自TMPWindows系统上的环境变量

  • 这不是那么简单,这个答案仍然不正确.在Windows上,`java.io.tmpdir`是使用Windows SDK函数`GetTempPath`(http://msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx)定义的.如果未定义前面的每个,则解析为TMP或TEMP或USERPROFILE或Windows目录. (12认同)
  • 这并不能回答我的问题。是否有一个环境变量来控制这个? (4认同)
  • 尽管你的编辑,Bryan,java.io.tmpdir肯定不遵循Mac或Ubuntu上的TMPDIR环境变量(在6.06上测试). (3认同)
  • @扎克。答案是特定于平台的。 (2认同)

Joh*_*ohn 61

您可以设置_JAVA_OPTIONS环境变量.例如在bash中这可以解决问题:

export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir
Run Code Online (Sandbox Code Playgroud)

我把它放到我的bash登录脚本中,它似乎可以解决问题.

  • 虽然这似乎适用于Linux和MacOSX,但它在每次java启动时都会产生一些额外输出的不幸副作用:`拾取_JAVA_OPTIONS:`这完全混淆了我们的构建过程. (3认同)
  • 我做了这个答案的投票,因为它确实回答了用户的问题并且用户没有指定操作系统或者想要避免任何其他方面的影响.我认为这应该是最好的答案 (3认同)
  • 根据[这个答案](/sf/ask/1982933431/#33556407)关于环境变量之间的差异,`JAVA_TOOL_OPTIONS`更具可移植性。 (3认同)
  • 这个变量似乎特定于Sun JVM - IBM J9 JVM不支持它; 它确实支持IBM_JAVA_OPTIONS (2认同)

小智 36

使用

$ java -XshowSettings
Property settings:
    java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
    java.io.tmpdir = /tmp
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 27

它不是环境变量,但仍然可以控制temp目录:

-Djava.io.tmpdir
Run Code Online (Sandbox Code Playgroud)

例:

java -Djava.io.tmpdir=/mytempdir
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 16

要清楚这里发生了什么:

  • 设置临时目录位置的推荐方法是设置名为"java.io.tmpdir"系统属性,例如,通过给选项-Djava.io.tmpdir=/mytempdirjava命令.也可以通过调用模块System.setProperty("java.io.tmpdir", "/mytempdir)沙箱安全问题从程序中更改属性.

  • 如果未在启动时显式设置"java.io.tmpdir"属性,则JVM会将其初始化为特定平台的默认值.对于Windows,默认值是通过调用Win32 API方法获得的.对于Linux/Solaris,默认显然是硬连线的.对于其他JVM,它可能是其他东西.

根据经验,"TMP"环境变量适用于Windows(使用当前的JVM),但不适用于其他平台.如果您关心可移植性,则应明确设置系统属性.


小智 6

在 UNIX 终端上使用以下命令:

java -XshowSettings
Run Code Online (Sandbox Code Playgroud)

这将显示所有 java 属性和系统设置。在此寻找java.io.tmpdir价值。