Variable de entorno para controlar java.io.tmpdir?

109

He usado la TMPvariable de entorno para controlar cosas como donde gcc escribe sus archivos temporales, pero parece que no puedo encontrar un equivalente para la API createTempFile de Java .

¿Existe tal variable de entorno?

Zach Hirsch
fuente
El enlace real es java.sun.com/javase/6/docs/api/java/io/… , java.lang.String, java.io.File) Stackoverflow no hace lo correcto cuando coloco esa URL en (o cuando reemplazo el paréntesis con% 28 y% 29). Sé que usar la URL corta apesta, pero pensé que era mejor que ningún enlace.
Zach Hirsch
Arreglé el enlace. SO hace lo correcto muy bien.
rmeador
1
Gracias. Supongo que el truco también fue reemplazar los espacios con% 20
Zach Hirsch
1
todo lo que hice fue seguir tu enlace, copiar la URL de la barra de direcciones de mi navegador y pegarla en tu publicación donde estaba tu enlace corto.
rmeador

Respuestas:

118

Hmmm, dado que esto lo maneja la JVM, profundicé un poco en el código fuente de OpenJDK VM, pensando que tal vez lo que hace OpenJDK imita lo que hace Java 6 y versiones anteriores. No es tranquilizador que haya una forma de hacer esto que no sea Windows.

En Windows , la get_temp_directory()función de OpenJDK realiza una llamada API de Win32 a GetTempPath(); así es como en Windows, Java refleja el valor de la TMPvariable de entorno.

En Linux y Solaris , las mismas get_temp_directory()funciones devuelven un valor estático de /tmp/.

No sé si el JDK6 real sigue estas convenciones exactas, pero por el comportamiento en cada una de las plataformas enumeradas, parece que sí.

delfuego
fuente
38
Para que quede claro, lo que está viendo es el código nativo que proporciona el valor predeterminado para la propiedad "java.io.tmpdir" cuando la JVM crea el objeto de propiedades del sistema. Esto será anulado por (por ejemplo) una opción "-Djava.io.tmpdir = ...".
Stephen C
6
@StephenC, sí, ese es el punto: el OP estaba buscando cómo se establece el valor predeterminado para la propiedad en ausencia de configurarlo usted mismo (a través de la -Djava.io.tmpdiropción de línea de comando para la JVM), y si ese valor predeterminado se ve afectado en todo por un valor medioambiental. Como la gente había observado, en Windows se ve afectado por la TMPvariable de entorno, pero no estaba claro si había alguna variable desconocida para otros sistemas operativos. Parece que no lo hay, al menos dado lo que sabemos sobre OpenJDK.
delfuego
5
Buena respuesta, pero en Windows GetTempPath()no se ve afectado solo por la TMPvariable de entorno: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei
He visto que en Solaris Sun JDK el valor es /var/tmp/(con barra inclinada), incluso hay un error # 4391434 para eso. Y para Mac OS y Linux es/tmp , ¡qué lío!
dma_k
1
@Znik funciona con oracle-java8-jdk=8u102(linux)
Alex
118

Según java.io.FileJava Docs

El directorio de archivos temporales predeterminado lo especifica la propiedad del sistema java.io.tmpdir. En los sistemas UNIX, el valor predeterminado de esta propiedad suele ser "/ tmp" o "/ var / tmp"; en los sistemas Microsoft Windows suele ser "c: \ temp". Se puede dar un valor diferente a esta propiedad del sistema cuando se invoca la máquina virtual Java, pero no se garantiza que los cambios programáticos a esta propiedad tengan ningún efecto sobre el directorio temporal utilizado por este método.

Para especificar la java.io.tmpdirpropiedad del sistema, puede invocar la JVM de la siguiente manera:

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

De forma predeterminada, este valor debe provenir de la TMPvariable de entorno en los sistemas Windows.

Bryan Kyle
fuente
1
Esto no responde a mi pregunta. ¿Existe una variable de entorno que controle esto?
Zach Hirsch
3
A pesar de su edición, Bryan, java.io.tmpdir definitivamente no sigue la variable de entorno TMPDIR en Mac o Ubuntu (probado en 6.06).
delfuego
Oy, y otra edición, haciendo que todos estos comentarios parezcan absurdos.
delfuego
@Zach. La respuesta es específica de la plataforma.
Stephen C
12
No es tan simple y esta respuesta sigue siendo incorrecta. En Windows, java.io.tmpdirse define utilizando la función SDK de Windows GetTempPath( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ) que se resolverá en TMP o TEMP o USERPROFILE o el directorio de Windows si cada uno de el anterior no está definido.
Pascal Thivent
62

Podrías establecer tu _JAVA_OPTIONSvariable ambiental. Por ejemplo en bash esto haría el truco:

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

Lo puse en mi script de inicio de sesión de bash y parece funcionar.

Juan San Juan
fuente
3
Si bien esto parece funcionar en Linux y MacOSX, tiene el desafortunado efecto secundario de imprimir un resultado adicional en cada lanzamiento de Java: Picked up _JAVA_OPTIONS:esto confunde completamente nuestro proceso de compilación.
marc.guenther
3
Voté esta respuesta porque responde a la pregunta de los usuarios y el usuario no especificó el sistema operativo o quería evitar otros efectos secundarios. Creo que esto debería establecerse como la mejor respuesta
R. van Twisk
3
Esta variable parece ser específica de Sun JVM, ya que IBM J9 JVM no la admite; en su lugar, admite IBM_JAVA_OPTIONS
sendmoreinfo
@sendmoreinfo, funciona para Sun / Oracle y OpenJDK que yo sepa.
John St. John
1
Según esta respuesta sobre las diferencias entre variables de entorno, JAVA_TOOL_OPTIONSes más portable.
EndlosSchleife
38

Utilizar

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

No es una variable de entorno, pero aún le da control sobre el directorio temporal:

-Djava.io.tmpdir

ex.:

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

Para tener claro lo que está pasando aquí:

  • La forma recomendada de establecer la ubicación del directorio temporal es establecer la propiedad del sistema llamada "java.io.tmpdir", por ejemplo, dando la opción -Djava.io.tmpdir=/mytempdiral javacomando. La propiedad también se puede cambiar desde dentro de un programa llamando a System.setProperty("java.io.tmpdir", "/mytempdir)... modulo sandbox security issues.

  • Si no establece explícitamente la propiedad "java.io.tmpdir" en el inicio, la JVM la inicializa a un valor predeterminado específico de la plataforma . Para Windows, el valor predeterminado se obtiene mediante una llamada a un método API de Win32. Para Linux / Solaris, el valor predeterminado aparentemente está cableado. Para otras JVM, podría ser otra cosa.

Empíricamente, la variable de entorno "TMP" funciona en Windows (con las JVM actuales), pero no en otras plataformas. Si le preocupa la portabilidad, debe establecer explícitamente la propiedad del sistema.

Stephen C
fuente
2

Utilice el siguiente comando en la terminal UNIX:

java -XshowSettings

Esto mostrará todas las propiedades de Java y la configuración del sistema. En esta búsqueda de java.io.tmpdirvalor.

suhas
fuente