Usei a TMP
variável de ambiente para controlar coisas como onde o gcc grava seus arquivos temporários, mas não consigo encontrar um equivalente para a API createTempFile do java .
Essa variável de ambiente existe?
Usei a TMP
variável de ambiente para controlar coisas como onde o gcc grava seus arquivos temporários, mas não consigo encontrar um equivalente para a API createTempFile do java .
Essa variável de ambiente existe?
Respostas:
Hmmm - já que isso é feito pela JVM, eu mergulhei um pouco no código-fonte da VM OpenJDK, pensando que talvez o que é feito pelo OpenJDK imita o que é feito pelo Java 6 e anteriores. Não é reconfortante que haja uma maneira de fazer isso diferente do Windows.
No Windows , a get_temp_directory()
função do OpenJDK faz uma chamada de API do Win32 para GetTempPath()
; é assim que no Windows, Java reflete o valor da TMP
variável de ambiente.
No Linux e Solaris , as mesmas get_temp_directory()
funções retornam um valor estático de /tmp/
.
Não sei se o JDK6 real segue essas convenções exatas, mas pelo comportamento em cada uma das plataformas listadas, parece que sim.
-Djava.io.tmpdir
opção de linha de comando para a JVM), e se esse valor padrão é afetado em tudo por um valor ambiental. Como as pessoas observaram, no Windows ele é afetado pela TMP
variável de ambiente, mas não estava claro se havia alguma variável desconhecida para outros sistemas operacionais. Parece que não existe, pelo menos considerando o que sabemos sobre o OpenJDK.
GetTempPath()
não é afetado apenas pela TMP
variável de ambiente: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
/var/tmp/
(com uma barra inicial), há até o bug # 4391434 para isso. E para Mac OS e Linux é/tmp
- que bagunça!
oracle-java8-jdk=8u102
(linux)
De acordo com o java.io.File
Java Docs
O diretório de arquivo temporário padrão é especificado pela propriedade do sistema java.io.tmpdir. Em sistemas UNIX, o valor padrão desta propriedade é geralmente "/ tmp" ou "/ var / tmp"; em sistemas Microsoft Windows, normalmente é "c: \ temp". Um valor diferente pode ser fornecido a esta propriedade do sistema quando a máquina virtual Java é chamada, mas as mudanças programáticas nesta propriedade não têm garantia de nenhum efeito sobre o diretório temporário usado por este método.
Para especificar a java.io.tmpdir
propriedade do sistema, você pode invocar o JVM da seguinte maneira:
java -Djava.io.tmpdir=/path/to/tmpdir
Por padrão, este valor deve vir da TMP
variável de ambiente em sistemas Windows
java.io.tmpdir
é definido usando a função Windows SDK GetTempPath
( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ) que resolverá para TMP ou TEMP ou USERPROFILE ou o diretório do Windows se cada um dos o anterior não está definido.
Você pode definir sua _JAVA_OPTIONS
variável ambiental. Por exemplo, no bash, isso resolveria o problema:
export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir
Eu coloquei isso em meu script de login do bash e parece funcionar.
Picked up _JAVA_OPTIONS:
Isso confunde completamente nosso processo de construção.
JAVA_TOOL_OPTIONS
é mais portátil.
Usar
$ java -XshowSettings
Property settings:
java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
java.io.tmpdir = /tmp
Para ser claro sobre o que está acontecendo aqui:
A maneira recomendada de definir a localização do diretório temporário é definir a propriedade do sistema chamada "java.io.tmpdir", por exemplo, dando a opção -Djava.io.tmpdir=/mytempdir
para o java
comando. A propriedade também pode ser alterada de dentro de um programa chamando System.setProperty("java.io.tmpdir", "/mytempdir)
... modulo sandbox security issues.
Se você não definir explicitamente a propriedade "java.io.tmpdir" na inicialização, a JVM a inicializa com um valor padrão específico da plataforma . Para Windows, o padrão é obtido por uma chamada a um método da API Win32. Para Linux / Solaris, o padrão é aparentemente conectado fisicamente. Para outras JVMs, pode ser outra coisa.
Empiricamente, a variável de ambiente "TMP" funciona no Windows (com JVMs atuais), mas não em outras plataformas. Se você se preocupa com a portabilidade, deve definir explicitamente a propriedade do sistema.