Variabile d'ambiente per controllare java.io.tmpdir?


109

Ho usato la TMPvariabile d'ambiente per controllare cose come dove gcc scrive i suoi file temporanei, ma non riesco a trovare un equivalente per l' API createTempFile di java .

Esiste una tale variabile d'ambiente?


Il collegamento effettivo è java.sun.com/javase/6/docs/api/java/io/… , java.lang.String, java.io.File) Stackoverflow non fa la cosa giusta quando inserisco quell'URL (o quando sostituisco le parentesi con% 28 e% 29). So che usare l'URL breve fa schifo, ma ho pensato che fosse meglio di nessun collegamento.
Zach Hirsch

Ho corretto il collegamento. COSÌ fa la cosa giusta bene.
rmeador

1
Grazie. Immagino che il trucco fosse anche sostituire gli spazi con% 20
Zach Hirsch

1
tutto quello che ho fatto è stato seguire il tuo link, copiare l'URL dalla barra degli indirizzi del mio browser e incollarlo nel tuo post dove si trovava il tuo link breve.
rmeador

Risposte:


118

Hmmm - poiché questo è gestito dalla JVM, ho approfondito un po 'il codice sorgente di OpenJDK VM, pensando che forse ciò che è stato fatto da OpenJDK imita ciò che è stato fatto da Java 6 e precedenti. Non è rassicurante che ci sia un modo per farlo diverso da Windows.

Su Windows , la get_temp_directory()funzione di OpenJDK effettua una chiamata API Win32 a GetTempPath(); è così che su Windows, Java riflette il valore della TMPvariabile d'ambiente.

Su Linux e Solaris , le stesse get_temp_directory()funzioni restituiscono un valore statico di /tmp/.

Non so se l'attuale JDK6 segue esattamente queste convenzioni, ma dal comportamento su ciascuna delle piattaforme elencate, sembra che lo facciano.


38
Per essere chiari, quello che stai guardando è il codice nativo che fornisce il valore predefinito per la proprietà "java.io.tmpdir" quando la JVM crea l'oggetto Proprietà di sistema. Questo sarà sovrascritto (ad esempio) da un'opzione "-Djava.io.tmpdir = ...".
Stephen C

6
@StephenC, sì, questo è il punto: l'OP stava cercando come il valore predefinito per la proprietà viene impostato in assenza di impostazione da soli (tramite l' -Djava.io.tmpdiropzione della riga di comando per la JVM) e se quel valore predefinito è influenzato tutto da un valore ambientale. Come le persone avevano osservato, su Windows è influenzato dalla TMPvariabile d'ambiente, ma non era chiaro se ci fosse qualche variabile sconosciuta per altri sistemi operativi. Sembra che non ci sia, almeno dato quello che sappiamo su OpenJDK.
delfuego

5
Bella risposta, ma su Windows GetTempPath()non è influenzata solo dalla TMPvariabile d'ambiente: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei

Ho visto che su Solaris Sun JDK il valore è /var/tmp/(con barra iniziale), c'è anche il bug # 4391434 per questo. E per Mac OS e Linux è/tmp - che casino!
dma_k

1
@Znik funziona con oracle-java8-jdk=8u102(linux)
Alex

118

Secondo java.io.FileJava Docs

La directory dei file temporanei predefinita è specificata dalla proprietà di sistema java.io.tmpdir. Su sistemi UNIX il valore predefinito di questa proprietà è tipicamente "/ tmp" o "/ var / tmp"; sui sistemi Microsoft Windows è tipicamente "c: \ temp". È possibile assegnare un valore diverso a questa proprietà di sistema quando viene richiamata la Java virtual machine, ma non è garantito che le modifiche programmatiche a questa proprietà abbiano alcun effetto sulla directory temporanea utilizzata da questo metodo.

Per specificare la java.io.tmpdirproprietà System, è possibile richiamare la JVM come segue:

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

Per impostazione predefinita, questo valore dovrebbe provenire dalla TMPvariabile di ambiente sui sistemi Windows


1
Questo non risponde alla mia domanda. C'è una variabile d'ambiente che controlla questo?
Zach Hirsch

3
Nonostante la tua modifica, Bryan, java.io.tmpdir sicuramente non segue la variabile d'ambiente TMPDIR su Mac o su Ubuntu (testato su 6.06).
delfuego

Oy, e un'altra modifica, facendo sembrare tutti questi commenti privi di senso.
delfuego

@Zach. La risposta è specifica della piattaforma.
Stephen C

12
Non è così semplice e questa risposta è ancora errata. Su Windows, java.io.tmpdirè definito utilizzando la funzione Windows SDK GetTempPath( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ) che si risolverà in TMP o TEMP o USERPROFILE o la directory di Windows se ciascuno di il precedente non è definito.
Pascal Thivent

62

Puoi impostare la tua _JAVA_OPTIONSvariabile ambientale. Ad esempio in bash questo farebbe il trucco:

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

L'ho inserito nel mio script di login di bash e sembra che faccia il trucco.


3
Anche se sembra funzionare su Linux e MacOSX, ha lo sfortunato effetto collaterale di stampare un output aggiuntivo su ogni lancio di java: Picked up _JAVA_OPTIONS:questo confonde completamente il nostro processo di compilazione.
marc.guenther

3
Ho votato questa risposta perché risponde alla domanda degli utenti e l'utente non ha specificato il sistema operativo o non voleva evitare altri effetti collaterali. Credo che questo dovrebbe essere impostato come migliore risposta
R. van Twisk

3
Questa variabile sembra essere specifica di Sun JVM, ad esempio la JVM J9 di IBM non la supporta; invece supporta IBM_JAVA_OPTIONS
sendmoreinfo

@sendmoreinfo, funziona per Sun / Oracle e OpenJDK per quanto ne so.
John St. John

1
Secondo questa risposta sulle differenze tra le variabili d'ambiente, JAVA_TOOL_OPTIONSè più portabile.
EndlosSchleife

38

Uso

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

28

Non è una variabile di ambiente, ma ti dà comunque il controllo sulla directory temp:

-Djava.io.tmpdir

ex.:

java -Djava.io.tmpdir=/mytempdir

17

Per essere chiari su cosa sta succedendo qui:

  • Il modo consigliato per impostare l'ubicazione della directory temporanea è impostare la proprietà System chiamata "java.io.tmpdir", ad esempio dando l'opzione -Djava.io.tmpdir=/mytempdiral javacomando. La proprietà può anche essere modificata dall'interno di un programma chiamando System.setProperty("java.io.tmpdir", "/mytempdir)... modulo sandbox security issues.

  • Se non si imposta esplicitamente la proprietà "java.io.tmpdir" all'avvio, la JVM la inizializza su un valore predefinito specifico della piattaforma . Per Windows, il valore predefinito si ottiene tramite una chiamata a un metodo API Win32. Per Linux / Solaris l'impostazione predefinita è apparentemente cablata. Per altre JVM potrebbe essere qualcos'altro.

Empiricamente, la variabile d'ambiente "TMP" funziona su Windows (con le JVM correnti), ma non su altre piattaforme. Se ti interessa la portabilità devi impostare esplicitamente la proprietà di sistema.


2

Usa il comando seguente sul terminale UNIX:

java -XshowSettings

Questo mostrerà tutte le proprietà java e le impostazioni di sistema. In questa ricerca di java.io.tmpdirvalore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.