环境变量来控制java.io.tmpdir?


109

我已经使用TMP环境变量来控制诸如gcc将其写入临时文件的位置,但是我似乎找不到与Java的createTempFile API 等效的东西。

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


实际的链接是java.sun.com/javase/6/docs/api/java/io/…,java.lang.String,java.io.File)当我将该URL放入(或者当我用%28和%29替换括号时)。我知道使用短网址很烂,但我认为这比根本没有链接要好。
Zach Hirsch

我修复了链接。所以做正确的事情就好了。
rmeador

1
谢谢。我猜想,技巧还在于用%20代替空格
Zach Hirsch

1
我要做的就是跟随您的链接,将URL复制到浏览器的地址栏中,然后将其粘贴到您的短链接所在的帖子中。
rmeador

Answers:


118

嗯-由于这是由JVM处理的,因此我稍微研究了OpenJDK VM源代码,以为OpenJDK所做的事情可能模仿Java 6及以前的版本。除了在Windows上,还不能保证有其他方法可以做到这一点。

Windows上,OpenJDK的get_temp_directory()函数对Win32 API进行调用GetTempPath();这就是Windows上Java如何反映TMP环境变量的值的方式。

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

我不知道实际的JDK6是否遵循这些确切的约定,但是通过列出的每个平台上的行为,看来它们确实如此。


38
明确地说,您正在查看的是在JVM创建系统属性对象时为“ java.io.tmpdir”属性提供默认值的本地代码。(例如)“-Djava.io.tmpdir = ...”选项将覆盖它。
Stephen C

6
@StephenC,是的,关键是-OP正在寻找如何在不自行设置属性的情况下(通过-Djava.io.tmpdirJVM 的命令行选项)设置属性的默认值,以及该默认值是否受到影响。所有这些都取决于环境价值。如人们所观察到的,在Windows上,它受影响的TMP环境变量,但目前还不清楚是否有其他操作系统的一些未知的变数。似乎没有,至少考虑到我们对OpenJDK的了解。
2009年

5
很好的答案,但在Windows GetTempPath()上不仅受TMP环境变量的影响:msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei 2012年

我已经看到,在Solaris Sun JDK上,该值是/var/tmp/(带有斜杠),甚至还有bug#4391434。而对于Mac OS和Linux是/tmp -什么乱七八糟的!
dma_k 2012年

1
@Znik确实适用于oracle-java8-jdk=8u102(linux)
Alex Alex

118

根据java.io.FileJava Docs

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

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

java -Djava.io.tmpdir=/path/to/tmpdir

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


1
这没有回答我的问题。是否有环境变量可以控制这一点?
Zach Hirsch,2009年

3
尽管进行了编辑,Bryan的java.io.tmpdir绝对不会在Mac或Ubuntu(已在6.06上测试)上遵循TMPDIR环境变量。
delfuego

Oy,以及另一个编辑,使所有这些评论都显得荒谬。
delfuego

@扎克 答案是特定于平台的。
Stephen C

12
并不是那么简单,这个答案仍然是错误的。在Windows上,java.io.tmpdir使用Windows SDK函数GetTempPathmsdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx)进行定义,该函数将解析为TMP或TEMP或USERPROFILE或Windows目录(如果每个前一个未定义。
Pascal Thivent 09年

62

您可以设置_JAVA_OPTIONS环境变量。例如,在bash中可以达到目的:

export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir

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


3
尽管这似乎可以在Linux和MacOSX上运行,但不幸的是,它在每次Java启动时都会打印一些其他输出,这带来了不幸的副作用:Picked up _JAVA_OPTIONS:这完全使我们的构建过程感到困惑。
marc.guenther 2011年

3
我对这个答案投了赞成票,因为它确实回答了用户的问题,并且用户未指定操作系统或希望避免任何其他不利影响。我认为这应该是最好的答案
R. van Twisk

3
这个变量似乎是特定于Sun JVM的-如果IBM J9 JVM不支持它;请参见第5章。它确实支持IBM_JAVA_OPTIONS
sendmoreinfo 2014年

@sendmoreinfo,据我所知它适用于Sun / Oracle和OpenJDK。
约翰·圣约翰

1
根据这个答案,关于环境变量之间的差异,JAVA_TOOL_OPTIONS是比较可移植的。
EndlosSchleife


28

它不是环境变量,但仍使您可以控制temp dir:

-Djava.io.tmpdir

例如:

java -Djava.io.tmpdir=/mytempdir

17

要弄清楚这里发生了什么:

  • 设置临时目录位置的推荐方法是通过给选项中设置所谓的“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)上运行,而不能在其他平台上运行。如果您关心可移植性,则应显式设置系统属性。


2

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

java -XshowSettings

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.