Java.io.tmpdir'i kontrol etmek için ortam değişkeni?


110

TMPGcc'nin geçici dosyalarını yazdığı gibi şeyleri kontrol etmek için ortam değişkenini kullandım , ancak java'nın createTempFile API'si için bir eşdeğer bulamıyorum .

Böyle bir ortam değişkeni var mı?


Gerçek bağlantı java.sun.com/javase/6/docs/api/java/io/… , java.lang.String, java.io.File şeklindedir) Stackoverflow, bu URL'yi koyduğumda doğru şeyi yapmıyor (veya parantezleri% 28 ve% 29 ile değiştirdiğimde). Kısa URL'yi kullanmanın berbat olduğunu biliyorum, ancak bağlantı olmaması daha iyi olduğunu düşündüm.
Zach Hirsch

Bağlantıyı düzelttim. SO doğru olanı gayet iyi yapar.
rmeador

1
Teşekkürler. Sanırım püf noktası boşlukları% 20 ile değiştirmekti
Zach Hirsch

1
Tek yaptığım, bağlantınızı takip etmek, tarayıcımın adres çubuğunun URL'sini kopyalamak ve kısa bağlantınızın olduğu yayınınıza yapıştırmaktı.
rmeador

Yanıtlar:


118

Hmmm - bu JVM tarafından ele alındığından, OpenJDK VM kaynak kodunu biraz araştırdım, OpenJDK tarafından yapılanların Java 6 ve öncesi tarafından yapılanları taklit edebileceğini düşündüm. Bunu yapmanın Windows dışında bir yolu olduğu konusunda güven verici değil.

On Windows'un , OpenJDK en get_temp_directory()işlevi, bir Win32 API çağrısını yapar GetTempPath(); Java, Windows'ta TMPortam değişkeninin değerini böyle yansıtır .

On Linux ve Solaris , aynı get_temp_directory()fonksiyonlar statik değeri döndürür /tmp/.

Gerçek JDK6'nın bu kurallara tam olarak uyup uymadığını bilmiyorum, ancak listelenen platformların her birindeki davranışa göre, öyle görünüyor.


39
Açık olmak gerekirse, baktığınız şey , JVM System properties nesnesini oluşturduğunda "java.io.tmpdir" özelliği için varsayılan değeri sağlayan yerel koddur . Bu, (örneğin) bir "-Djava.io.tmpdir = ..." seçeneği ile geçersiz kılınır.
Stephen C

6
@StephenC, evet, nokta bu - OP, özelliğin varsayılan değerinin, kendiniz ayarlamadan (JVM'ye -Djava.io.tmpdirkomut satırı seçeneği aracılığıyla) nasıl ayarlanacağını ve bu varsayılan değerin etkilenip etkilenmediğini arıyordu . hepsi bir çevre değeriyle. İnsanlar gözlenen ettiği gibi, Windows o olduğunu etkilenen TMPortam değişkeni, ancak diğer işletim sistemleri için bazı bilinmeyen değişken olsaydı şimdiye belli değildi. En azından OpenJDK hakkında bildiklerimiz göz önüne alındığında, yok gibi görünüyor.
delfuego

5
Güzel yanıt, ancak Windows'ta GetTempPath()yalnızca TMPortam değişkeninden etkilenmez : msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei

Solaris Sun JDK'da değerin (baştaki/var/tmp/ eğik çizgiyle) olduğunu gördüm , bunun için # 4391434 hatası bile var. Ve Mac OS ve Linux için bu/tmp - ne karmaşa!
dma_k

1
@Znik oracle-java8-jdk=8u102(linux) ile çalışıyor
Alex

118

Göre java.io.FileJava Dokümanlar

Varsayılan geçici dosya dizini, java.io.tmpdir sistem özelliği tarafından belirtilir. UNIX sistemlerinde bu özelliğin varsayılan değeri genellikle "/ tmp" veya "/ var / tmp" dir; Microsoft Windows sistemlerinde tipik olarak "c: \ temp" dir. Java sanal makinesi çağrıldığında bu sistem özelliğine farklı bir değer verilebilir, ancak bu özelliğe yapılan programlı değişikliklerin, bu yöntem tarafından kullanılan geçici dizin üzerinde herhangi bir etkisi olacağı garanti edilmez.

java.io.tmpdirSystem özelliğini belirtmek için JVM'yi şu şekilde çağırabilirsiniz:

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

Varsayılan olarak bu değer TMPWindows sistemlerindeki ortam değişkeninden gelmelidir


1
Bu soruma cevap vermiyor. Bunu kontrol eden bir ortam değişkeni var mı?
Zach Hirsch

3
Yaptığınız düzenlemeye rağmen, Bryan, java.io.tmpdir, Mac veya Ubuntu'da (6.06'da test edilmiştir) TMPDIR ortam değişkenini kesinlikle takip etmiyor.
delfuego

Oy ve başka bir düzenleme, tüm bu yorumları mantıksız gösteriyor.
delfuego

@Zach. Cevap platforma özeldir.
Stephen C

12
O kadar basit değil ve bu cevap hala yanlış. Windows'ta, java.io.tmpdirWindows SDK işlevi GetTempPath( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ) kullanılarak tanımlanır; bu, TMP veya TEMP veya USERPROFILE veya Windows önceki tanımlı değil.
Pascal Thivent

62

_JAVA_OPTIONSÇevresel değişkeninizi ayarlayabilirsiniz . Örneğin, bash'da bu hile yapacaktı:

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

Bunu bash giriş betiğime koydum ve hile yapıyor gibi görünüyor.


3
Bu, Linux ve MacOSX'te işe yarıyor gibi görünse de, her java başlangıcında bazı ek çıktılar yazdırmanın talihsiz yan etkisine sahiptir: Picked up _JAVA_OPTIONS:Bu, oluşturma sürecimizi tamamen karıştırır.
marc.guenther

3
Bu yanıtı oyladım çünkü kullanıcıların sorusunu yanıtlıyor ve kullanıcı işletim sistemini belirtmiyor veya başka herhangi bir yan etkiden kaçınmak istemiyor. Bunun en iyi cevap olarak belirlenmesi gerektiğine inanıyorum
R. van Twisk

3
Bu değişken Sun JVM'ye özgü gibi görünüyor - çünkü IBM J9 JVM bunu desteklemiyor; bunun yerine IBM_JAVA_OPTIONS'ı destekliyor
IBM_JAVA_OPTIONS'ı sendmoreinfo

@sendmoreinfo, bilgime göre Sun / Oracle ve OpenJDK için çalışıyor.
John St.John

1
Göre Ortam değişkenleri arasındaki farklarla ilgili bu yanıtaJAVA_TOOL_OPTIONS , daha taşınabilirdir.
EndlosSchleife

38

Kullanım

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

28

Bu bir ortam değişkeni değildir, ancak yine de temp dizini üzerinde kontrol sağlar:

-Djava.io.tmpdir

ör .:

java -Djava.io.tmpdir=/mytempdir

17

Burada neler olup bittiğini netleştirmek için:

  • Geçici dizin konumunu ayarlamak için tavsiye edilen bir yol seçeneği vererek "java.io.tmpdir" olarak adlandırılan sistem özelliği, örneğin ayarlamaktır -Djava.io.tmpdir=/mytempdiriçin javakomuta. Özellik, bir program içinden System.setProperty("java.io.tmpdir", "/mytempdir)modulo sandbox güvenlik sorunlarını ... çağırarak da değiştirilebilir .

  • Başlangıçta "java.io.tmpdir" özelliğini açıkça ayarlamazsanız, JVM bunu platforma özgü varsayılan bir değere başlatır . Windows için varsayılan, bir Win32 API yöntemine yapılan çağrı ile elde edilir. Linux / Solaris için varsayılan, görünüşe göre fiziksel bağlantılı. Diğer JVM'ler için başka bir şey olabilir.

Deneysel olarak, "TMP" ortam değişkeni Windows'ta (mevcut JVM'lerle) çalışır, ancak diğer platformlarda çalışmaz. Taşınabilirliği önemsiyorsanız, sistem özelliğini açıkça ayarlamalısınız.


2

UNIX terminalinde aşağıdaki komutu kullanın:

java -XshowSettings

Bu, tüm java özelliklerini ve sistem ayarlarını gösterecektir. Bu java.io.tmpdirdeğer arayışında .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.