2009-12-17 19 views
83

Ho usato la variabile di ambiente TMP per controllare cose come dove gcc scrive che sono file temporanei, ma non riesco a trovare un equivalente per l'API createTempFile di java.Variabile di ambiente per controllare java.io.tmpdir?

Esiste una variabile di questo tipo?

+0

il collegamento reale è http://java.sun.com/javase/6/docs/api/java/io/File.html#createTempFile(java.lang.String , java.lang.String, java.io.File) Stackoverflow non fa la cosa giusta quando inserisco l'URL in (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. –

+0

Ho risolto il collegamento. SO fa la cosa giusta bene. – rmeador

+1

Grazie. Immagino che il trucco fosse anche la sostituzione degli spazi con% 20 –

risposta

100

Hmmm - - poiché questo è gestito dalla JVM, ho approfondito un po 'il codice sorgente di OpenJDK VM, pensando che forse ciò che viene 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 funzione get_temp_directory() di OpenJDK effettua una chiamata API Win32 a GetTempPath(); questo è come su Windows, Java riflette il valore della variabile di ambiente TMP.

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

Non so se l'effettivo JDK6 segua queste esatte convenzioni, ma dal comportamento su ciascuna delle piattaforme elencate, sembra che lo facciano.

+12

Ottima risposta, incluso l'uso del famoso "usa la fonte". +1 –

+28

Per essere chiari, ciò che si sta 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 verrà sovrascritto da (per esempio) un'opzione "-Djava.io.tmpdir = ...". –

+0

Grazie, delfuego. Questo ha certamente senso. –

22

Non è una variabile di ambiente, ma dà ancora di controllare la directory temp:

-Djava.io.tmpdir 

es .:

java -Djava.io.tmpdir=/mytempdir 
86

Secondo il java.io.File Java Docs

La directory del file temporaneo predefinita è specificata dalla proprietà di sistema java.io.tmpdir. Sui sistemi UNIX il valore predefinito di questa proprietà è in genere "/ tmp" o "/ var/tmp"; sui sistemi Microsoft Windows è in genere "c: \ temp". Un valore diverso può essere assegnato a questa proprietà di sistema quando viene richiamata la macchina virtuale Java, ma non si garantisce che le modifiche programmatiche a questa proprietà abbiano alcun effetto sulla directory temporanea utilizzata da questo metodo.

Per specificare la proprietà java.io.tmpdir sistema, è possibile richiamare la JVM come segue:

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

Per impostazione predefinita questo valore dovrebbe venire dalla variabile TMP ambiente su sistemi Windows

+0

Questo non risponde alla mia domanda. C'è una variabile di ambiente che controlla questo? –

+1

Nonostante la modifica, Bryan, java.io.tmpdir sicuramente non segue la variabile di ambiente TMPDIR su Mac o su Ubuntu (testata il 6.06). – delfuego

+0

Oy e un'altra modifica, rendendo tutti questi commenti apparentemente privi di senso. – delfuego

12

essere chiari su quello che sta succedendo qui:

  • Il metodo consigliato per impostare il percorso della directory temporanea è quello di impostare la proprietà di sistema denominata "java.io.tmpdir", ad esempio, dando l'opzione -Djava.io.tmpdir=/mytempdir al comando java. La proprietà può anche essere modificata da un programma chiamando System.setProperty("java.io.tmpdir", "/mytempdir) ... problemi di sicurezza del modulo sandbox.

  • Se non si imposta in modo esplicito la proprietà "java.io.tmpdir" all'avvio, la JVM inizializza a uno specifico valore di defaultpiattaforma. Per Windows, il valore predefinito è ottenuto da una chiamata a un metodo API Win32.Per Linux/Solaris l'impostazione predefinita è apparentemente cablata. Per altri JVM potrebbe essere qualcos'altro.

Empiricamente, la variabile di 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.

47

È possibile impostare la variabile ambientale _JAVA_OPTIONS. Per esempio in bash questo sarebbe fare il trucco:

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

che ho messo nel mio scritto di inizio bash e sembra fare il trucco.

+1

Anche se sembra funzionare su Linux e MacOSX, ha lo sfortunato effetto collaterale di stampare qualche output aggiuntivo su ogni java: 'Ritirato _JAVA_OPTIONS:' Questo confonde completamente il nostro processo di compilazione. –

+3

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

+1

Questa variabile sembra essere specifica per Sun JVM - f.e. l'IBM J9 JVM non lo supporta; supporta IBM_JAVA_OPTIONS invece – sendmoreinfo

31

Usa

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

esattamente quello di cui avevo bisogno – yatendra

Problemi correlati