Variável de ambiente para controlar java.io.tmpdir?

109

Usei a TMPvariá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?

Zach Hirsch
fonte
O link real é java.sun.com/javase/6/docs/api/java/io/… , java.lang.String, java.io.File) Stackoverflow não faz a coisa certa quando coloco esse URL em (ou quando eu substituir os parênteses por% 28 e% 29). Eu sei que usar o url curto é uma droga, mas achei que era melhor do que nenhum link.
Zach Hirsch
Consertei o link. ASSIM faz a coisa certa muito bem.
rmeador
1
Obrigado. Acho que o truque também foi substituir os espaços por% 20
Zach Hirsch
1
tudo o que fiz foi seguir seu link, copiar o URL da barra de endereços do meu navegador e colá-lo em sua postagem onde estava seu link curto.
rmeador

Respostas:

118

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 TMPvariá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.

Delfuego
fonte
38
Para ficar claro, o que você está vendo é o código nativo que fornece o valor padrão para a propriedade "java.io.tmpdir" quando a JVM cria o objeto Propriedades do sistema. Isso será substituído (por exemplo) por uma opção "-Djava.io.tmpdir = ...".
Stephen C
6
@StephenC, sim, esse é o ponto - o OP estava procurando como o valor padrão para a propriedade é definido na ausência de sua configuração (por meio da -Djava.io.tmpdiropçã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 TMPvariá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.
delfuego
5
Boa resposta, mas no Windows GetTempPath()não é afetado apenas pela TMPvariável de ambiente: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei
Eu vi que no Solaris Sun JDK o valor é /var/tmp/(com uma barra inicial), há até o bug # 4391434 para isso. E para Mac OS e Linux é/tmp - que bagunça!
dma_k
1
@Znik trabalha com oracle-java8-jdk=8u102(linux)
Alex
118

De acordo com o java.io.FileJava 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.tmpdirpropriedade 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 TMPvariável de ambiente em sistemas Windows

Bryan Kyle
fonte
1
Isso não responde minha pergunta. Existe uma variável de ambiente que controla isso?
Zach Hirsch
3
Apesar de sua edição, Bryan, java.io.tmpdir definitivamente não segue a variável de ambiente TMPDIR no Mac ou no Ubuntu (testado em 6.06).
delfuego
Ei, e outra edição, fazendo com que todos esses comentários pareçam sem sentido.
delfuego
@Zach. A resposta é específica da plataforma.
Stephen C
12
Não é tão simples e esta resposta ainda está incorreta. No 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.
Pascal Thivent
62

Você pode definir sua _JAVA_OPTIONSvariá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.

John St. John
fonte
3
Embora pareça funcionar em Linux e MacOSX, tem o infeliz efeito colateral de imprimir algumas saídas adicionais em cada lançamento de java: Picked up _JAVA_OPTIONS:Isso confunde completamente nosso processo de construção.
marc.guenther de
3
Eu votei esta resposta porque ela responde à pergunta do usuário e o usuário não especificou o sistema operacional ou quer evitar qualquer outro efeito colateral. Eu acredito que esta deve ser definida como a melhor resposta
R. van Twisk
3
Esta variável parece ser específica para Sun JVM - por exemplo, o IBM J9 JVM não a suporta; ele oferece suporte a IBM_JAVA_OPTIONS
sendmoreinfo,
@sendmoreinfo, funciona para Sun / Oracle e OpenJDK que eu saiba.
John St. John,
1
De acordo com esta resposta sobre as diferenças entre as variáveis ​​de ambiente, JAVA_TOOL_OPTIONSé mais portátil.
EndlosSchleife
38

Usar

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

Não é uma variável de ambiente, mas ainda fornece controle sobre o diretório temporário:

-Djava.io.tmpdir

ex.:

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

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=/mytempdirpara o javacomando. 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.

Stephen C
fonte
2

Use o comando abaixo no terminal UNIX:

java -XshowSettings

Isso exibirá todas as propriedades java e configurações do sistema. Nesta busca por java.io.tmpdirvalor.

suhas
fonte