Zmienna środowiskowa do sterowania java.io.tmpdir?

110

Użyłem TMPzmiennej środowiskowej do kontrolowania rzeczy, takich jak miejsce, w którym gcc zapisuje swoje pliki tymczasowe, ale nie mogę znaleźć odpowiednika dla API createTempFile w Javie .

Czy taka zmienna środowiskowa istnieje?

Zach Hirsch
źródło
Rzeczywisty link to java.sun.com/javase/6/docs/api/java/io/… , java.lang.String, java.io.File) Stackoverflow nie działa prawidłowo, gdy umieszczam ten adres URL w (lub gdy zamieniam nawiasy na% 28 i% 29). Wiem, że używanie krótkiego adresu URL jest do bani, ale doszedłem do wniosku, że to lepsze niż brak linku.
Zach Hirsch,
Naprawiłem link. TAK robi dobrze.
rmeador
1
Dzięki. Myślę, że sztuczka polegała na zamianie spacji na% 20
Zach Hirsch,
1
Wszystko, co zrobiłem, to podążanie za twoim linkiem, skopiowanie adresu URL z paska adresu mojej przeglądarki i wklejenie go do twojego posta, gdzie był twój krótki link.
rmeador

Odpowiedzi:

118

Hmmm - ponieważ jest to obsługiwane przez JVM, zagłębiłem się trochę w kod źródłowy maszyny wirtualnej OpenJDK, myśląc, że może to, co robi OpenJDK, naśladuje to, co robi Java 6 i wcześniejsze. Nie jest uspokajające, że można to zrobić inaczej niż w systemie Windows.

W systemie Windowsget_temp_directory() funkcja OpenJDK wykonuje wywołanie interfejsu API Win32 GetTempPath(); w ten sposób w systemie Windows Java odzwierciedla wartość TMPzmiennej środowiskowej.

W systemach Linux i Solaris te same get_temp_directory()funkcje zwracają statyczną wartość /tmp/.

Nie wiem, czy rzeczywisty JDK6 przestrzega dokładnie tych konwencji, ale po zachowaniu na każdej z wymienionych platform wydaje się, że tak.

delfuego
źródło
39
Aby było jasne, patrzysz na kod natywny, który zapewnia domyślną wartość właściwości „java.io.tmpdir”, gdy maszyna JVM tworzy obiekt Właściwości systemu. Zostanie to zastąpione (na przykład) opcją „-Djava.io.tmpdir = ...”.
Stephen C
6
@StephenC, tak, o to chodzi - OP szukał, w jaki sposób wartość domyślna właściwości zostanie ustawiona w przypadku braku jej samodzielnego ustawiania (za pomocą -Djava.io.tmpdiropcji wiersza poleceń do maszyny JVM) i czy ma to wpływ na tę wartość domyślną wszystko przez wartość środowiskową. Jak ludzie zauważyli, w systemie Windows ma na nią wpływ TMPzmienna środowiskowa, ale nie było jasne, czy istnieje jakaś nieznana zmienna dla innych systemów operacyjnych. Wygląda na to, że nie ma, przynajmniej biorąc pod uwagę to, co wiemy o OpenJDK.
delfuego
5
Dobra odpowiedź, ale w systemie Windows GetTempPath()nie wpływa tylko TMPzmienna środowiskowa: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei
Widziałem, że w Solaris Sun JDK wartość to /var/tmp/(z początkowym ukośnikiem), jest nawet błąd # 4391434 . A w przypadku systemów Mac OS i Linux jest to/tmp - co za bałagan!
dma_k
1
@Znik współpracuje z oracle-java8-jdk=8u102(linux)
Alex
118

Według java.io.FileJava Docs

Domyślny katalog plików tymczasowych jest określony we właściwości systemowej java.io.tmpdir. W systemach UNIX domyślną wartością tej właściwości jest zazwyczaj „/ tmp” lub „/ var / tmp”; w systemach Microsoft Windows jest to zazwyczaj „c: \ temp”. Ta właściwość systemowa może mieć inną wartość, gdy wywoływana jest wirtualna maszyna Java, ale programowe zmiany tej właściwości nie mają żadnego wpływu na katalog tymczasowy używany przez tę metodę.

Aby określić java.io.tmpdirwłaściwość System, można wywołać maszynę JVM w następujący sposób:

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

Domyślnie ta wartość powinna pochodzić ze TMPzmiennej środowiskowej w systemach Windows

Bryan Kyle
źródło
1
To nie odpowiada na moje pytanie. Czy istnieje zmienna środowiskowa, która to kontroluje?
Zach Hirsch,
3
Pomimo twojej edycji Bryan, java.io.tmpdir zdecydowanie nie stosuje się do zmiennej środowiskowej TMPDIR na Macu lub Ubuntu (testowane na 6.06).
delfuego
Oy, i kolejna edycja, dzięki której wszystkie te komentarze wydają się bezsensowne.
delfuego
@Zach. Odpowiedź jest zależna od platformy.
Stephen C
12
To nie jest takie proste, a ta odpowiedź jest nadal nieprawidłowa. W systemie Windows java.io.tmpdirjest definiowany za pomocą funkcji Windows SDK GetTempPath( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ), która rozwiąże TMP lub TEMP lub USERPROFILE lub katalog Windows, jeśli każdy z poprzednia nie jest zdefiniowana.
Pascal Thivent
62

Możesz ustawić _JAVA_OPTIONSzmienną środowiskową. Na przykład w bashu wystarczyłoby to:

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

Umieściłem to w moim skrypcie logowania bash i wydaje się, że działa.

John St. John
źródło
3
Chociaż wydaje się, że działa to w systemach Linux i MacOSX, ma niefortunny efekt uboczny polegający na drukowaniu dodatkowych danych wyjściowych przy każdym uruchomieniu Java: Picked up _JAVA_OPTIONS:to całkowicie dezorientuje nasz proces kompilacji.
marc.guenther
3
Zagłosowałem na tę odpowiedź, ponieważ odpowiada ona na pytanie użytkownika, a użytkownik nie określił systemu operacyjnego lub nie chciał uniknąć wpływu innych stron. Uważam, że to najlepsza odpowiedź
R. van Twisk
3
Ta zmienna wydaje się być specyficzna dla Sun JVM - np. IBM J9 JVM jej nie obsługuje; zamiast tego obsługuje IBM_JAVA_OPTIONS
sendmoreinfo
@sendmoreinfo, o ile wiem, działa dla Sun / Oracle i OpenJDK.
John St. John
1
Zgodnie z tą odpowiedzią dotyczącą różnic między zmiennymi środowiskowymi, JAVA_TOOL_OPTIONSjest bardziej przenośna.
EndlosSchleife
38

Posługiwać się

$ java -XshowSettings
Property settings:
    java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
    java.io.tmpdir = /tmp
Nisar Ahmed
źródło
28

Nie jest to zmienna środowiskowa, ale nadal zapewnia kontrolę nad katalogiem tymczasowym:

-Djava.io.tmpdir

dawny.:

java -Djava.io.tmpdir=/mytempdir
Bozho
źródło
17

Aby mieć jasność co do tego, co się tutaj dzieje:

  • Zalecany sposób ustawić tymczasową lokalizację katalogu jest ustawić właściwość system o nazwie „java.io.tmpdir”, na przykład przez podanie opcji -Djava.io.tmpdir=/mytempdirdo javapolecenia. Właściwość można również zmienić z poziomu programu, wywołując System.setProperty("java.io.tmpdir", "/mytempdir)... modulo kwestie bezpieczeństwa piaskownicy.

  • Jeśli właściwość „java.io.tmpdir” nie zostanie jawnie ustawiona podczas uruchamiania, maszyna JVM zainicjuje ją na wartość domyślną specyficzną dla platformy . W przypadku systemu Windows wartość domyślna jest uzyskiwana przez wywołanie metody interfejsu API Win32. W systemie Linux / Solaris wartość domyślna jest najwyraźniej połączona na stałe. W przypadku innych maszyn JVM może to być coś innego.

Z empirycznego punktu widzenia zmienna środowiskowa „TMP” działa w systemie Windows (z obecnymi maszynami JVM), ale nie na innych platformach. Jeśli zależy Ci na przenośności, powinieneś jawnie ustawić właściwość systemową.

Stephen C.
źródło
2

Użyj poniższego polecenia na terminalu UNIX:

java -XshowSettings

Spowoduje to wyświetlenie wszystkich właściwości Java i ustawień systemowych. W tym poszukiwaniu java.io.tmpdirwartości.

suhas
źródło