我已经使用TMP
环境变量来控制诸如gcc将其写入临时文件的位置,但是我似乎找不到与Java的createTempFile API 等效的东西。
是否存在这样的环境变量?
我已经使用TMP
环境变量来控制诸如gcc将其写入临时文件的位置,但是我似乎找不到与Java的createTempFile API 等效的东西。
是否存在这样的环境变量?
Answers:
嗯-由于这是由JVM处理的,因此我稍微研究了OpenJDK VM源代码,以为OpenJDK所做的事情可能模仿Java 6及以前的版本。除了在Windows上,还不能保证有其他方法可以做到这一点。
在Windows上,OpenJDK的get_temp_directory()
函数对Win32 API进行调用GetTempPath()
;这就是Windows上Java如何反映TMP
环境变量的值的方式。
在Linux和Solaris上,相同的get_temp_directory()
函数返回的静态值/tmp/
。
我不知道实际的JDK6是否遵循这些确切的约定,但是通过列出的每个平台上的行为,看来它们确实如此。
-Djava.io.tmpdir
JVM 的命令行选项)设置属性的默认值,以及该默认值是否受到影响。所有这些都取决于环境价值。如人们所观察到的,在Windows上,它是受影响的TMP
环境变量,但目前还不清楚是否有其他操作系统的一些未知的变数。似乎没有,至少考虑到我们对OpenJDK的了解。
GetTempPath()
上不仅受TMP
环境变量的影响:msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
oracle-java8-jdk=8u102
(linux)
默认的临时文件目录由系统属性java.io.tmpdir指定。在UNIX系统上,此属性的缺省值通常为“ / tmp”或“ / var / tmp”;默认值为“ / tmp”或“ / var / tmp”。在Microsoft Windows系统上,通常为“ c:\ temp”。调用Java虚拟机时,可以为此系统属性赋予不同的值,但是不能保证对该属性的编程更改对此方法使用的临时目录没有任何影响。
要指定java.io.tmpdir
System属性,可以按如下所示调用JVM:
java -Djava.io.tmpdir=/path/to/tmpdir
默认情况下,该值应来自TMP
Windows系统上的环境变量
java.io.tmpdir
使用Windows SDK函数GetTempPath
(msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx)进行定义,该函数将解析为TMP或TEMP或USERPROFILE或Windows目录(如果每个前一个未定义。
您可以设置_JAVA_OPTIONS
环境变量。例如,在bash中可以达到目的:
export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir
我把它放到我的bash登录脚本中,似乎可以解决问题。
Picked up _JAVA_OPTIONS:
这完全使我们的构建过程感到困惑。
JAVA_TOOL_OPTIONS
是比较可移植的。
用
$ java -XshowSettings
Property settings:
java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
java.io.tmpdir = /tmp
要弄清楚这里发生了什么:
设置临时目录位置的推荐方法是通过给选项中设置所谓的“java.io.tmpdir”系统属性,例如-Djava.io.tmpdir=/mytempdir
到java
命令。还可以通过调用System.setProperty("java.io.tmpdir", "/mytempdir)
...模数沙箱安全性问题在程序中更改该属性。
如果在启动时未明确设置“ java.io.tmpdir”属性,则JVM会将其初始化为特定于平台的默认值。对于Windows,默认值是通过调用Win32 API方法获得的。对于Linux / Solaris,默认值显然是硬连线的。对于其他JVM,可能还有其他事情。
根据经验,“ TMP”环境变量可在Windows(使用当前JVM)上运行,而不能在其他平台上运行。如果您关心可移植性,则应显式设置系统属性。