R と Java


rJava のインストールに問題があることが多い。

基本的には、rJava は、ソースインストール時に以下のコマンドを実行する。

$ sudo R CMD javareconf

これで、R の Java へのパスが更新される。

ここで更新されるファイルは以下のふたつ。

${R_HOME}/etc/ldpaths

${R_HOME}/etc/Makeconf

ところが、この二つのファイルの Java 設定がそもそも一致していない。

Mac では、基本的に Java は、/usr/libexec/java_home で、どのバージョンの Java がデフォルトかが指定されている。

そこで、まず、Makeconf の Java を、/usr/libexec/java_home で設定するように書き換える。

$ sed -i -e 's|JAR = |JAR = $(/usr/libexec/java_home)/bin/jar #|g' ${R_HOME}/etc/Makeconf
$ sed -i -e 's|JAVA = |JAVA = $(/usr/libexec/java_home)/bin/java #|g' ${R_HOME}/etc/Makeconf
$ sed -i -e 's|JAVAC = |JAVAC = $(/usr/libexec/java_home)/bin/javac #|g' ${R_HOME}/etc/Makeconf
$ sed -i -e 's|JAVAH = |JAVAH = $(/usr/libexec/java_home)/bin/javah #|g' ${R_HOME}/etc/Makeconf

また、 ldpaths は、ハードコードが必要なので、こちらも /usr/libexec/java_home と一致しているか確認する。

$ export JAVA_HOME=$( grep "JAVA_HOME=" ${R_HOME}/etc/ldpaths | sed -e "s|: \${JAVA_HOME=\([^\}]*\)}|\1|" )
$ if [ ${JAVA_HOME} != $(/usr/libexec/java_home) ]; then
$   export JAVA_HOME=$(/usr/libexec/java_home)
$   sed -i -e "s|JAVA_HOME=[^\n]*|JAVA_HOME=${JAVA_HOME}}|g" ${R_HOME}/etc/ldpaths
$ fi

また、Fink の場合、Fink で管理されているファイルを書き換えることはそのままではできない。

このため、上のスクリプトは、前半は InstallScript 内に記述し、後半は PostInstScript に記述した。

これでも、java_home が変わった時はエラーが出る可能性がある。だが、以前よりは改善になったであろう。