OWASP ZAPもそうですが、セキュリティ関連のツールにはJavaで作られたものがわりと多いようです。クロスプラットフォームだし、必要なライブラリもまとめて配布するスタイル(?)なので使う側もラクです。以前自作したクローラ耐性診断ツールも、そういう状況に合わせてJavaで作りました。ただ Mac OS X上でそれらを実行するとなると、どのJavaが使用されているのか?や、そもそもMac OS XのデフォルトのJavaと自分でインストールしたOracleのJavaがどのような扱いになっているのかを知っておかないとトラブルがあった時などに困ります。そこで、Mac OS X 上でのJavaの扱いについてまとめておくことにしました。意外とこの手の情報は少なく不正確な部分もあると思うので、間違っているところがあれば指摘してもらえるとありがたいです。
環境
- Mac OS X 10.9.2
Java関連の主なパス
/System/Library/Frameworks/JavaVM.framework/
- Appleが管理している。
- インストールされているJavaを利用するためのインタフェースになっている。
- この下にいろいろなディレクトリがあるが、ほとんどがシンボリックリンクになっていて次項目の /System/Library/Java/JavaVirtualMachines/ を指している。
- なのでサイズは非常に小さい。
- 但し、/System/Library/Frameworks/JavaVM.framework/Versions/Current/ は、/System/Library/Frameworks/JavaVM.framework/Versions/A/ を指しており扱いが異なる。
- A/Commands/ディレクトリ以下にある各コマンド(java コマンド等)は、それぞれが小さなサイズのバイナリになっており、環境変数 JAVA_HOME によって実行するコマンドの実体を切り替えている(と思われる)。その候補の中には、/Library/Java/JavaVirtualMachines/ 以下にインストールされた OracleのJDKも含まれる。
- 環境変数 JAVA_HOMEが設定されていなければ、/usr/libexec/java_home コマンドをオプションなしで実行して出力されるパスが JAVA_HOME と見なされる。通常はインストールされている中で最新のバージョンが適用される。
- /usr/bin/ 以下にある Java関連のコマンドは、この Current/Commands/ 以下の各コマンドへのシンボリックリンクになっているので、普通に java コマンドを実行する(/usr/bin/javaを実行する)と 環境変数 JAVA_HOME で指定されたJavaのコマンドが実行される。
- A/Commands/ディレクトリ以下にある各コマンド(java コマンド等)は、それぞれが小さなサイズのバイナリになっており、環境変数 JAVA_HOME によって実行するコマンドの実体を切り替えている(と思われる)。その候補の中には、/Library/Java/JavaVirtualMachines/ 以下にインストールされた OracleのJDKも含まれる。
/System/Library/Java/JavaVirtualMachines/
- Appleが用意したJDKがインストールされている。
- バージョン 1.6.0 のJDKがインストールされていた。
/Library/Java/JavaVirtualMachines/
- OracleのJDK はここにインストールされる。
- 手動でインストールする必要がある。
- バージョンごとにディレクトリが作成される。
- 例
- jdk1.7.0_25.jdk/
- jdk1.7.0_51.jdk/
- jdk1.7.0_55.jdk/
- /System/Library/Frameworks/JavaVM.framework/Versions/Current/ からも使用される。
/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/
- ブラウザ用であると思われる。
- OracleのJRE はここにインストールされる。
- 新しいバージョンを入れると古いバージョンは上書きされた。
- [システム環境設定] –> [Javaコントロール・パネル] の [Java Runtime Environment 設定] では、ここの情報が表示される。
- このパネルからバージョンを更新することができる。
環境変数 JAVA_HOME の設定 (使用するJavaの切り替え)
/usr/libexec/java_home コマンドを使って設定する。
- このコマンドの実体は、/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java_home である。
このコマンドの使用方法
# インストールされている全てのJavaとそのホームディレクトリを表示する。
$ /usr/libexec/java_home -V
# その中から特定のバージョンのホームディレクトリだけを出力する。
$ /usr/libexec/java_home -v バージョン名
# オプションなしだと最新版のパスが出力される。
$ /usr/libexec/java_home
# --exec オプションを使うと特定のバージョンのjava関連コマンドが実行できる。
# (例)バージョン 1.7.0_55 の java コマンドを実行する
$ /usr/libexec/java_home -v 1.7.0_55 --exec java -version
# 詳細は $ man java_home で確認できる。
JAVA_HOMEの設定例(bashの場合)
#例1
export JAVA_HOME=`/usr/libexec/java_home`
#例2 特定のバージョンを指定する場合
export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_55`
[最終更新日: 2014年4月17日]