Variable d'environnement pour contrôler java.io.tmpdir?

110

J'ai utilisé la TMPvariable d'environnement pour contrôler des choses comme l'endroit où gcc écrit ses fichiers temporaires, mais je n'arrive pas à trouver un équivalent pour l' API createTempFile de java .

Une telle variable d'environnement existe-t-elle?

Zach Hirsch
la source
Le lien réel est java.sun.com/javase/6/docs/api/java/io/… , java.lang.String, java.io.File) Stackoverflow ne fait pas la bonne chose quand je mets cette URL dans (ou lorsque je remplace les parenthèses par% 28 et% 29). Je sais que l'utilisation de l'url courte est nul, mais j'ai pensé que c'était mieux que pas de lien du tout.
Zach Hirsch
J'ai réparé le lien. SO fait très bien la bonne chose.
rmeador
1
Merci. Je suppose que l'astuce consistait également à remplacer les espaces par% 20
Zach Hirsch
1
tout ce que j'ai fait a été de suivre votre lien, de copier l'URL de la barre d'adresse de mon navigateur et de la coller dans votre message à l'emplacement de votre lien court.
rmeador

Réponses:

118

Hmmm - puisque cela est géré par la JVM, j'ai fouillé un peu dans le code source de la VM OpenJDK, pensant que peut-être ce qui est fait par OpenJDK imite ce qui est fait par Java 6 et antérieurs. Il n'est pas rassurant qu'il existe un moyen de le faire autrement que sous Windows.

Sous Windows , la get_temp_directory()fonction d'OpenJDK effectue un appel d'API Win32 à GetTempPath(); c'est ainsi que sous Windows, Java reflète la valeur de la TMPvariable d'environnement.

Sous Linux et Solaris , les mêmes get_temp_directory()fonctions renvoient une valeur statique de /tmp/.

Je ne sais pas si le JDK6 réel suit ces conventions exactes, mais par le comportement sur chacune des plates-formes répertoriées, il semble que ce soit le cas.

delfuego
la source
39
Pour être clair, ce que vous regardez est le code natif qui fournit la valeur par défaut de la propriété "java.io.tmpdir" lorsque la JVM crée l'objet Propriétés système. Cela sera remplacé par (par exemple) une option "-Djava.io.tmpdir = ...".
Stephen C
6
@StephenC, oui, c'est le point - l'OP cherchait comment la valeur par défaut de la propriété est définie en l'absence de la définir vous-même (via l' -Djava.io.tmpdiroption de ligne de commande de la JVM), et si cette valeur par défaut est affectée à le tout par une valeur environnementale. Comme les gens l'avaient observé, sous Windows, il est affecté par la TMPvariable d'environnement, mais il n'était pas clair s'il y avait une variable inconnue pour d'autres systèmes d'exploitation. Il semble qu'il n'y en ait pas, du moins compte tenu de ce que nous savons d'OpenJDK.
delfuego
5
Bonne réponse, mais sur Windows GetTempPath()n'est pas affecté uniquement par la TMPvariable d'environnement: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei
J'ai vu que sur Solaris Sun JDK, la valeur est /var/tmp/(avec une barre oblique principale), il y a même un bogue # 4391434 pour cela. Et pour Mac OS et Linux c'est/tmp - quel gâchis!
dma_k
1
@Znik fonctionne avec oracle-java8-jdk=8u102(linux)
Alex
118

Selon les java.io.Filedocuments Java

Le répertoire de fichiers temporaires par défaut est spécifié par la propriété système java.io.tmpdir. Sur les systèmes UNIX, la valeur par défaut de cette propriété est généralement "/ tmp" ou "/ var / tmp"; sur les systèmes Microsoft Windows, il s'agit généralement de "c: \ temp". Une valeur différente peut être donnée à cette propriété système lorsque la machine virtuelle Java est appelée, mais les modifications programmatiques de cette propriété ne sont pas garanties d'avoir un effet sur le répertoire temporaire utilisé par cette méthode.

Pour spécifier la java.io.tmpdirpropriété System, vous pouvez appeler la JVM comme suit:

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

Par défaut, cette valeur doit provenir de la TMPvariable d'environnement sur les systèmes Windows

Bryan Kyle
la source
1
Cela ne répond pas à ma question. Existe-t-il une variable d'environnement qui contrôle cela?
Zach Hirsch
3
Malgré votre modification, Bryan, java.io.tmpdir ne suit certainement pas la variable d'environnement TMPDIR sur Mac ou sur Ubuntu (testé sur 6.06).
delfuego
Oy, et une autre modification, rendant tous ces commentaires absurdes.
delfuego
@Zach. La réponse est spécifique à la plateforme.
Stephen C
12
Ce n'est pas si simple et cette réponse est toujours incorrecte. Sous Windows, java.io.tmpdirest défini à l'aide de la fonction Windows SDK GetTempPath( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ) qui se résoudra en TMP ou TEMP ou USERPROFILE ou le répertoire Windows si chacun des le précédent n'est pas défini.
Pascal Thivent
62

Vous pouvez définir votre _JAVA_OPTIONSvariable environnementale. Par exemple, dans bash, cela ferait l'affaire:

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

Je l'ai mis dans mon script de connexion bash et cela semble faire l'affaire.

John St. John
la source
3
Bien que cela semble fonctionner sur Linux et MacOSX, cela a pour effet secondaire malheureux d'imprimer une sortie supplémentaire à chaque lancement de java: Picked up _JAVA_OPTIONS:cela confond complètement notre processus de construction.
marc.guenther
3
J'ai voté cette réponse car elle répond à la question des utilisateurs et l'utilisateur n'a pas spécifié le système d'exploitation ou ne souhaitant éviter aucun autre effet secondaire. Je crois que cela devrait être défini comme la meilleure réponse
R. van Twisk
3
Cette variable semble être spécifique à Sun JVM - par exemple, la JVM IBM J9 ne la prend pas en charge; il prend en charge IBM_JAVA_OPTIONS à la place
sendmoreinfo
@sendmoreinfo, cela fonctionne pour Sun / Oracle et OpenJDK à ma connaissance.
John
1
Selon cette réponse sur les différences entre les variables d'environnement, JAVA_TOOL_OPTIONSest plus portable.
EndlosSchleife
38

Utilisation

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

Ce n'est pas une variable d'environnement, mais vous donne toujours le contrôle sur le répertoire temporaire:

-Djava.io.tmpdir

ex.:

java -Djava.io.tmpdir=/mytempdir
Bozho
la source
17

Pour être clair sur ce qui se passe ici:

  • La manière recommandée de définir l'emplacement du répertoire temporaire est de définir la propriété System appelée "java.io.tmpdir", par exemple en donnant l'option -Djava.io.tmpdir=/mytempdirà la javacommande. La propriété peut également être modifiée à partir d'un programme en appelant System.setProperty("java.io.tmpdir", "/mytempdir)... modulo sandbox security issues.

  • Si vous ne définissez pas explicitement la propriété "java.io.tmpdir" au démarrage, la JVM l'initialise avec une valeur par défaut spécifique à la plate - forme . Pour Windows, la valeur par défaut est obtenue par un appel à une méthode API Win32. Pour Linux / Solaris, la valeur par défaut est apparemment câblée. Pour d'autres JVM, cela pourrait être autre chose.

Empiriquement, la variable d'environnement "TMP" fonctionne sur Windows (avec les JVM actuels), mais pas sur d'autres plates-formes. Si vous vous souciez de la portabilité, vous devez définir explicitement la propriété système.

Stephen C
la source
2

Utilisez la commande ci-dessous sur le terminal UNIX:

java -XshowSettings

Cela affichera toutes les propriétés java et les paramètres système. Dans cette recherche de java.io.tmpdirvaleur.

suhas
la source