Ho usato la TMP
variabile 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?
Ho usato la TMP
variabile 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?
Risposte:
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 TMP
variabile 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.
-Djava.io.tmpdir
opzione 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 TMP
variabile 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.
GetTempPath()
non è influenzata solo dalla TMP
variabile d'ambiente: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
/var/tmp/
(con barra iniziale), c'è anche il bug # 4391434 per questo. E per Mac OS e Linux è/tmp
- che casino!
oracle-java8-jdk=8u102
(linux)
Secondo java.io.File
Java 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.tmpdir
proprietà System, è possibile richiamare la JVM come segue:
java -Djava.io.tmpdir=/path/to/tmpdir
Per impostazione predefinita, questo valore dovrebbe provenire dalla TMP
variabile di ambiente sui sistemi 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.
Puoi impostare la tua _JAVA_OPTIONS
variabile 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.
Picked up _JAVA_OPTIONS:
questo confonde completamente il nostro processo di compilazione.
JAVA_TOOL_OPTIONS
è più portabile.
Uso
$ java -XshowSettings
Property settings:
java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
java.io.tmpdir = /tmp
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=/mytempdir
al java
comando. 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.