java.io.tmpdirを制御する環境変数?


109

TMP環境変数を使用して、gccが一時ファイルであることを書き込む場所などを制御しましたが、JavaのcreateTempFile APIに相当するものを見つけることができないようです。

そのような環境変数は存在しますか?


実際のリンクはjava.sun.com/javase/6/docs/api/java/io/…、java.lang.String、java.io.File)です。そのURLにStackoverflowを配置すると、正しく機能しません(または、括弧を%28と%29で置き換えた場合)。短いURLを使用するのは大変なことですが、リンクをまったく使用しないよりはましだと思いました。
Zach Hirsch、

リンクを修正しました。SOは正しいことをうまく行います。
rmeador

1
ありがとう。トリックもスペースを%20で置き換えていたと思います
Zach Hirsch

1
私がしたことは、リンクをたどり、ブラウザのアドレスバーからURLをコピーして、ショートリンクがあった投稿に貼り付けただけです。
rmeador 2009

回答:


118

うーん-これはJVMによって処理されるため、OpenJDK VMのソースコードを少し掘り下げ、OpenJDKで行われたことがJava 6以前で行われたことを模倣しているのではないかと考えました。Windows以外でこれを行う方法があることは安心できません。

のWindows、OpenJDKののget_temp_directory()機能は、Win32 APIの呼び出しにしますGetTempPath()。これは、WindowsでJavaがTMP環境変数の値を反映する方法です。

のLinuxおよびSolarisの、同じget_temp_directory()機能がの静的な値を返します/tmp/

実際のJDK6がこれらの厳密な規則に準拠しているかどうかはわかりませんが、リストされている各プラットフォームでの動作により、実際に準拠しているようです。


38
明確に言うと、JVMがシステムプロパティオブジェクトを作成するときに「java.io.tmpdir」プロパティのデフォルト値を提供するネイティブコードです。これは、(たとえば)「-Djava.io.tmpdir = ...」オプションによってオーバーライドされます。
スティーブンC

6
@StephenC、そうです、それがポイントです-OPは、プロパティのデフォルト値が自分で設定されていない場合(-Djava.io.tmpdirJVMのコマンドラインオプションを介して)にどのように設定されるかを探していました。すべて環境値によって。人々が観察したように、Windowsではによって影響を受けるTMP環境変数が、他のOSのためのいくつかの未知の変数があったかどうかは不明でした。少なくともOpenJDKについて私たちが知っていることを考えると、そうではないようです。
デルフエゴ2009

5
いい答えですが、Windowsでは環境変数GetTempPath()だけでは影響を受けませんTMPmsdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei

Solaris Sun JDKでは値が/var/tmp/(先行スラッシュ付き)であることがわかりました。そのためのバグ#4391434さえあります。そしてMac OSとLinuxの場合、それは/tmpなんてめちゃくちゃなことでしょう。
dma_k 2012年

1
@Znikはoracle-java8-jdk=8u102(Linux)で動作します
Alex

118

Javaドキュメントによるとjava.io.File

デフォルトの一時ファイルディレクトリは、システムプロパティjava.io.tmpdirによって指定されます。UNIXシステムでは、このプロパティのデフォルト値は通常「/ tmp」または「/ var / tmp」です。Microsoft Windowsシステムでは、通常「c:\ temp」です。Java仮想マシンが呼び出されると、このシステムプロパティに別の値が与えられる可能性がありますが、このプロパティへのプログラムによる変更が、このメソッドで使用される一時ディレクトリに影響を与えるとは限りません。

java.io.tmpdirSystemプロパティを指定するには、次のようにJVMを呼び出すことができます。

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

デフォルトでは、この値は TMP Windowsシステムの環境変数ます


1
これは私の質問の答えにはなりません。これを制御する環境変数はありますか?
Zach Hirsch、

3
編集にもかかわらず、Bryanのjava.io.tmpdirは、MacまたはUbuntu(6.06でテスト済み)のTMPDIR環境変数に確実に準拠していません。
デルフエゴ2009

オイ、そして別の編集で、これらすべてのコメントは無意味に思える。
デルフエゴ2009

@ザック。答えはプラットフォーム固有です。
スティーブンC

12
それはそれほど単純ではなく、この答えはまだ正しくありません。Windowsでは、java.io.tmpdirWindows SDK関数GetTempPathmsdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx)を使用して定義され、TMPまたはTEMPまたはUSERPROFILEまたはWindowsディレクトリに解決されます。以前は定義されていません。
Pascal Thivent 2009

62

_JAVA_OPTIONS環境変数を設定できます。たとえばbashでは、これでうまくいきます:

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

私はそれを私のbashログインスクリプトに入れ、それはトリックを行うようです。


3
これはLinuxとMacOSXで動作するようですが、Javaの起動ごとに追加の出力を出力するという残念な副作用がありPicked up _JAVA_OPTIONS:ます。これは、ビルドプロセスを完全に混乱させます。
marc.guenther 2010年

3
ユーザーの質問に対する回答であり、ユーザーがOSを指定しなかった、または他の副作用を回避したかったため、私はこの回答に投票しました。私は、これが最良の答えのように設定する必要があると考えている
R.バンTwisk

3
この変数はSun JVMに固有のようです-IBM J9 JVMがサポートしていない場合。代わりにIBM_JAVA_OPTIONSをサポートしています
sendmoreinfo

@sendmoreinfo、私の知る限り、Sun / OracleおよびOpenJDKで動作します。
ジョンセントジョン

1
環境変数の違いについてのこの回答によると、JAVA_TOOL_OPTIONSより移植性があります。
EndlosSchleife

38

使用する

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

28

これは環境変数ではありませんが、一時ディレクトリを制御できます。

-Djava.io.tmpdir

例:

java -Djava.io.tmpdir=/mytempdir

17

ここで何が起こっているのかを明確にするために:

  • 一時ディレクトリの場所を設定するための推奨される方法は、 "java.io.tmpdir"と呼ばれるシステムプロパティを設定することです。たとえば-Djava.io.tmpdir=/mytempdirjavaコマンドにオプションを与えることによってです。プロパティは、System.setProperty("java.io.tmpdir", "/mytempdir)... moduloサンドボックスのセキュリティ問題を呼び出すことにより、プログラム内から変更することもできます。

  • 起動時に「java.io.tmpdir」プロパティを明示的に設定しない場合、JVMはそれをプラットフォーム固有のデフォルト値に初期化します。Windowsの場合、デフォルトはWin32 APIメソッドの呼び出しによって取得されます。Linux / Solarisの場合、デフォルトは明らかにハードワイヤードです。他のJVMの場合、それは別の可能性があります。

経験的に、「TMP」環境変数はWindows(現在のJVM)で機能しますが、他のプラットフォームでは機能しません。移植性を重視する場合は、システムプロパティを明示的に設定する必要があります。


2

UNIX端末で以下のコマンドを使用します。

java -XshowSettings

これにより、すべてのJavaプロパティとシステム設定が表示されます。このjava.io.tmpdir値を探します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.