Javaの使用する環境変数

2019年5月28日

Java関連の環境変数についてまとめてみる。というのも、何の目的なのか不明なものが多々あるからだ。この点について明確にしたいと思う。

Windows上の環境変数設定方法

なお、Windows上で環境変数を設定するのであれば、他のウェブでも推奨しているが、Rapid Environment Editorが使いやすいと思う。

コントロールパネルから操作することを考えるとうんざりするが、これがあればそのようなことも無い。ただし、設定した後に、Windowsからログオフあるいは再起動しなければならないのが面倒だが、これはWindowsの仕様の方なので、このソフトとは無関係だ。

_JAVA_OPTIONS

最初の文字がアンダースコアであることに注意。

非公式変数であること。

_JAVA_OPTIONSについての文書化はされておらず、使用は推奨されないらしい。また、他のJava-VM(Oracle製以外のVM、IBM等がある)では必ずしもサポートされていないかもしれない。

実際にIBM製Javaでは、_JAVA_OPTIONSではなく、IBM_JAVA_OPTIONSが使用されているとのこと。

使用方法

これは(Oracle製の)JVM等が受け入れるオプションらしい。例えば、以下のように使う。

set _JAVA_OPTIONS=-Duser.language=en
java -jar sample.jar

つまり、以下と同じ効果になる。

java -Duser.language=en -jar sample.jar

ただし、_JAVA_OPTIONS環境変数の方を設定すると、標準エラー出力に

Picked up _JAVA_OPTIONS: -Duser.language=en

などという表示がされてしまう。消す方法は不明。

コマンド引数より優先されてしまう

これはひどい仕様だと思うのだが、例えば以下のように環境変数もコマンド引数も指定した場合

set _JAVA_OPTIONS=-Duser.language=en
java -Duser.language=ja -jar sample.jar

環境変数の方が優先されてしまう。つまり、「user.language=en」になる。

JAVA_TOOL_OPTIONS

_JAVA_OPTIONSと全く同じ機能のようだ。なぜ二つもあるのか不明だが。

_JAVA_OPTIONSを含めた優先順位

_JAVA_OPTIONS、コマンドラインとの優先順位関係は以下になっている。

  • _JAVA_OPTIONS
  • コマンドライン
  • JAVA_TOOL_OPTIONS

つまり、_JAVA_OPTIONSがもっとも強力で、先に書いたようにコマンドラインでの指定さえキャンセルしてしまうのだが、JAVA_TOOL_OPTIONSはコマンドラインよりも弱く、コマンドラインでキャンセルすることができる。例えば、以下のように記述すると。

set JAVA_TOOL_OPTIONS=-Duser.language=en
java -Duser.language=ja -jar sample.jar

「user.language=ja」になるというわけだ。これが「正しい」動作だろう。

オフィシャル文書に記述あり

JAVA_TOOL_OPTIONSについてはオフィシャルな文書に記述がある。

実際に、「すべてのVMで認識されている」という人がいる。これを使用するのは安全のようだ。

JAVA_OPTS

全くの非公式な環境変数であり、Javaオフィシャルのツールでは読み込まれない。元々はApacheのアプリか何かで使われ始め、その後これを利用するアプリが増えたようだ。

JAVA_HOME

これも公式なものではない。デファクト標準とも言うべきものか。おそらくこれも最初にApacheあたりが使い始めたのだろう。TomcatやAndroid開発環境等が参照していると言われる。

これはJREではなくJDKを指し示すものだそうだ。だから、一般ユーザにはまるで無関係である。開発者、あるいはJDKが必要な環境のみ、なおかつこれらの「参照するアプリ」を使いたいときにだけ指定すればよい。

Windows上であれば、例えば、次の値になる。

C:\Program Files\Java\jdk-10.0.2

以下ではない。

C:\Program Files\Java\jre-10.0.2

ちなみに、私はまるで設定していない。ほとんどEclipseしか使わないのだが、当然ながらEclipseはこれを参照していない。Eclipse内部で簡単にJDKを切り替えられるようになっているので、そもそもこんな環境変数を見てその通りにしてもらっては困るというものだ。

JRE_HOME

これも非公式なものである。Tomcatを起動すると、「JAVA_HOMEかJRE_HOMEのどちらかを指定しろ」と言われるようだ。こちらはJDKではなく、JREの方を示す必要があるようだ。つまり、先の例でいえば、

C:\Program Files\Java\jre-10.0.2

になる。

※JAVA_HOME、JRE_HOME両方についてだが、ウェブによっては「Javaにとって必要な環境変数」であるかのように記述しているものがあるのだが、全くの間違いである。私自身も、少なくとも開発環境では設定していない(Tomcatをホストしているサーバには設定されているが)。

PathもしくはPATH

これはもちろんオフィシャルなJavaツールや、Tomcat等のJavaアプリ関連の標準環境変数ではなくOSの仕組みとしての一般的なものである。

あまり気にしたことがなかったのだが、Windows上ではPathというつづりであり、Linux等ではPATHというつづりになっていることに注意する。また、セパレータは、前者ではセミコロン、後者ではコロンである。

もちろん、Javaプログラムで解析等する場合は、これらの文字列がFile.pathSeparatorとして定義されている。

CLASSPATH

これは公式なものであり、Javaプログラム実行時に参照されるものなのだが、実際にこれを設定する必要は無いと思われる。よほど古いプログラムで無い限り。

現在はほぼ無視されていると思う。というのも、これはJavaプログラムの実行時に必要なすべてのライブラリを示しておくものなのだが、現代ではあまりに多種類のライブラリがあり、それも絶え間なく更新されているので、CLASSPATHに固定的なライブラリを指定しておき、それを利用するといったJavaプログラムは考えにくいからだ。このやり方はユーザに面倒な手間をかけさせるし、ライブラリの選定を間違えると容易に誤動作を起こすことだろう。

参考文献

以下を参考にした