Umgebungsvariable zur Steuerung von java.io.tmpdir?

109

Ich habe die TMPUmgebungsvariable verwendet, um beispielsweise zu steuern, wo gcc seine temporären Dateien schreibt, aber ich kann anscheinend kein Äquivalent für die createTempFile- API von Java finden .

Existiert eine solche Umgebungsvariable?

Zach Hirsch
quelle
Der eigentliche Link lautet java.sun.com/javase/6/docs/api/java/io/… , java.lang.String, java.io.File) Stackoverflow macht nicht das Richtige, wenn ich diese URL eingebe (oder wenn ich die Klammern durch% 28 und% 29 ersetze). Ich weiß, dass die Verwendung der kurzen URL zum Kotzen ist, aber ich dachte, es wäre besser als gar kein Link.
Zach Hirsch
Ich habe den Link repariert. SO macht das Richtige ganz gut.
Rmeador
1
Vielen Dank. Ich denke, der Trick bestand auch darin, die Leerzeichen durch% 20 zu ersetzen
Zach Hirsch
1
Ich bin nur Ihrem Link gefolgt, habe die URL aus der Adressleiste meines Browsers kopiert und in Ihren Beitrag eingefügt, in dem sich Ihr kurzer Link befand.
Rmeador

Antworten:

118

Hmmm - da dies von der JVM erledigt wird, habe ich mich ein wenig mit dem OpenJDK VM-Quellcode befasst und gedacht, dass das, was OpenJDK macht, vielleicht das nachahmt, was Java 6 und früher macht. Es ist nicht beruhigend, dass es einen anderen Weg gibt als unter Windows.

Unter Windows führt die OpenJDK- get_temp_directory()Funktion einen Win32-API-Aufruf durch GetTempPath(). Auf diese Weise spiegelt Java unter Windows den Wert der TMPUmgebungsvariablen wider .

Unter Linux und Solaris geben dieselben get_temp_directory()Funktionen einen statischen Wert von zurück /tmp/.

Ich weiß nicht, ob das tatsächliche JDK6 genau diesen Konventionen entspricht, aber aufgrund des Verhaltens auf jeder der aufgelisteten Plattformen scheint dies der Fall zu sein.

Delfuego
quelle
38
Um es klar auszudrücken , sehen Sie sich den nativen Code an, der den Standardwert für die Eigenschaft "java.io.tmpdir" bereitstellt, wenn die JVM das Systemeigenschaftenobjekt erstellt. Dies wird beispielsweise durch die Option "-Djava.io.tmpdir = ..." überschrieben.
Stephen C
6
@StephenC, yep, das ist der Punkt - das OP hat gesucht, wie der Standardwert für die Eigenschaft festgelegt wird -Djava.io.tmpdir, wenn er nicht selbst festgelegt wird (über die Befehlszeilenoption für die JVM) und ob dieser Standardwert bei beeinflusst wird alles durch einen Umgebungswert. Da die Menschen beobachtet hatten, auf Windows es wird von dem betroffenen TMPUmgebungsvariable, aber es war unklar , ob es eine unbekannte Variable für andere Betriebssysteme war. Es sieht so aus, als gäbe es keine, zumindest angesichts dessen, was wir über OpenJDK wissen.
Delfuego
5
Schöne Antwort, aber unter Windows GetTempPath()ist nicht nur von der TMPUmgebungsvariablen betroffen : msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei
Ich habe gesehen, dass unter Solaris Sun JDK der Wert /var/tmp/(mit führendem Schrägstrich) ist, dafür gibt es sogar den Fehler # 4391434 . Und für Mac OS und Linux ist es/tmp - was für ein Durcheinander!
dma_k
1
@ Znik funktioniert mit oracle-java8-jdk=8u102(Linux)
Alex
118

Laut den java.io.FileJava Docs

Das Standardverzeichnis für temporäre Dateien wird durch die Systemeigenschaft java.io.tmpdir angegeben. Auf UNIX-Systemen lautet der Standardwert dieser Eigenschaft normalerweise "/ tmp" oder "/ var / tmp". Auf Microsoft Windows-Systemen ist dies normalerweise "c: \ temp". Diese Systemeigenschaft kann einen anderen Wert erhalten, wenn die Java Virtual Machine aufgerufen wird. Es ist jedoch nicht garantiert, dass programmatische Änderungen an dieser Eigenschaft Auswirkungen auf das von dieser Methode verwendete temporäre Verzeichnis haben.

Um die java.io.tmpdirSystemeigenschaft anzugeben , können Sie die JVM wie folgt aufrufen:

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

Standardmäßig sollte dieser Wert aus der TMPUmgebungsvariablen auf Windows-Systemen stammen

Bryan Kyle
quelle
1
Dies beantwortet meine Frage nicht. Gibt es eine Umgebungsvariable, die dies steuert?
Zach Hirsch
3
Trotz Ihrer Bearbeitung, Bryan, folgt java.io.tmpdir definitiv nicht der Umgebungsvariablen TMPDIR auf Mac oder Ubuntu (getestet am 6.06).
Delfuego
Oy und eine weitere Änderung, die all diese Kommentare unsinnig erscheinen lässt.
Delfuego
@ Zach. Die Antwort ist plattformspezifisch.
Stephen C
12
Es ist nicht so einfach und diese Antwort ist immer noch falsch. Unter Windows java.io.tmpdirmithilfe der Windows SDK - Funktion definiert ist GetTempPath( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ), der TMP oder TEMP oder USERPROFILE oder das Windows - Verzeichnisses , wenn jeder wird beheben das vorherige ist nicht definiert.
Pascal Thivent
62

Sie können Ihre _JAVA_OPTIONSUmgebungsvariable festlegen . Zum Beispiel in Bash würde dies den Trick tun:

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

Ich habe das in mein Bash-Login-Skript eingefügt und es scheint den Trick zu tun.

John St. John
quelle
3
Während dies unter Linux und MacOSX zu funktionieren scheint, hat es den unglücklichen Nebeneffekt, dass bei jedem Java-Start zusätzliche Ausgaben gedruckt werden: Picked up _JAVA_OPTIONS:Dies verwirrt unseren Erstellungsprozess völlig.
März
3
Ich habe diese Antwort abgelehnt, weil sie die Frage des Benutzers beantwortet und der Benutzer das Betriebssystem nicht angegeben hat oder andere Nebenwirkungen vermeiden wollte. Ich glaube, dies sollte als beste Antwort festgelegt werden
R. van Twisk
3
Diese Variable scheint spezifisch für Sun JVM zu sein - zB die IBM J9 JVM unterstützt sie nicht; es unterstützt stattdessen IBM_JAVA_OPTIONS
sendmoreinfo
@sendmoreinfo, es funktioniert meines Wissens für Sun / Oracle und OpenJDK.
John St. John
1
Nach dieser Antwort über die Unterschiede zwischen Umgebungsvariablen JAVA_TOOL_OPTIONSist portabler.
EndlosSchleife
38

Verwenden

$ java -XshowSettings
Property settings:
    java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
    java.io.tmpdir = /tmp
Nisar Ahmed
quelle
28

Es ist keine Umgebungsvariable, gibt Ihnen aber dennoch die Kontrolle über das temporäre Verzeichnis:

-Djava.io.tmpdir

Ex.:

java -Djava.io.tmpdir=/mytempdir
Bozho
quelle
17

Um klar zu sein, was hier los ist:

  • Die empfohlene Methode zum Festlegen des temporären Verzeichnisverzeichnisses besteht darin, die Systemeigenschaft "java.io.tmpdir" festzulegen, z. B. indem Sie -Djava.io.tmpdir=/mytempdirdem javaBefehl die Option geben . Die Eigenschaft kann auch innerhalb eines Programms geändert werden, indem System.setProperty("java.io.tmpdir", "/mytempdir)... modulo sandbox-Sicherheitsprobleme aufgerufen werden.

  • Wenn Sie die Eigenschaft "java.io.tmpdir" beim Start nicht explizit festlegen, initialisiert die JVM sie mit einem plattformspezifischen Standardwert. Für Windows wird die Standardeinstellung durch einen Aufruf einer Win32-API-Methode erhalten. Für Linux / Solaris ist die Standardeinstellung anscheinend fest verdrahtet. Für andere JVMs könnte es etwas anderes sein.

Empirisch funktioniert die Umgebungsvariable "TMP" unter Windows (mit aktuellen JVMs), jedoch nicht auf anderen Plattformen. Wenn Sie sich für Portabilität interessieren, sollten Sie die Systemeigenschaft explizit festlegen.

Stephen C.
quelle
2

Verwenden Sie den folgenden Befehl auf dem UNIX-Terminal:

java -XshowSettings

Dadurch werden alle Java-Eigenschaften und Systemeinstellungen angezeigt. In diesem java.io.tmpdirWert suchen .

suhas
quelle