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?


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.


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


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.


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

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

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.