Javaのシステムプロパティの設定と文字エンコーディングについて改めて見直してみた

先日社内で環境変数_JAVA_OPTIONSを使っていると、javaコマンドの実行時にPicked up _JAVA_OPTIONS: ...が標準エラー出力に吐かれるため、アプリケーションがエラー判定してコケてしまうという話題が上がりました。

私自身はPicked up ...が出力されるのがイヤだったので、元々_JAVA_OPTIONSを設定しておらず、代わりにJAVA_OPTSを使っていました。

でも、JAVA_OPTSはJava系のアプリケーションが慣習的に用意しているだけで、javaコマンドにアプリケーションが渡してくれているというだけでした。

javaコマンドに何を渡したいかというと、-Dfile.encoding=UTF-8を渡したいという人がほとんどだと思います。

そこでこの機会にJavaのシステムプロパティの設定と文字コードがどういう動きをするのか整理してみました。

システムプロパティを設定するための環境変数について

javaコマンドが拾ってくれる環境変数は2つあります。

  • _JAVA_OPTIONS
  • JAVA_TOOL_OPTIONS

両方とも使い方は同じで、javaコマンドにシステムプロパティを渡すときと同じ書式で値を格納しておきます。 _JAVA_OPTIONSを設定するとPicked up ...が標準エラー出力に吐かれてしまうという話をしましたが、それはJAVA_TOOL_OPTIONSも同じです。残念。

ちなみに、両方に同じキーのプロパティを設定した場合は_JAVA_OPTIONSの方が優先されました。

結局、Picked up ...を出力させずに環境変数だけでjavaコマンドにシステムプロパティを渡す方法は見つかりませんでした。

代替としてjavaコマンドにaliasを張っている人が多いようです。私も昔はそうしていました。

文字エンコーディングの設定について

OS Xの場合、Javaのデフォルトの文字エンコーディングがMacRomanというものに設定されているので、file.encodingをUTF-8に設定しようというのが常識でした。

しかし、その常識はJava 7では異なります。

Java 7だとfile.encodingは環境変数LANGで判別されるのです。 ja_JP.UTF-8になっていればUTF-8になります。 en_US.UTF-8でもUTF-8になります。 CのときはUS-ASCIIになります。

結局のところ…

つまり、file.encodingを設定するために_JAVA_OPTIONS等を使っていた人は、Java 7を使うのであればLANGさえちゃんと設定しておけばもはや不要なのです。

OS Xのアプリに関しても書きたかったのですが整理がまだ足りてないので今日はここまで。