R 和 Java

在安装rJava时经常会遇到问题。

基本上,安装 rJava 的时候需要运行以下命令。

$ sudo R CMD javareconf

通过这一步,R 的 Java 路径将被更新。

以下是在这里更新的两个文件。

${R_HOME}/etc/ldpaths 的中文含义是:R安装目录下的etc文件夹中的ldpaths文件。

${R_HOME}/etc/Makeconf 可以将此表达为「${R_HOME}」程序目录下的「etc/Makeconf」文件。

可是,這兩個文件的 Java 設定本來就沒有一致。

在Mac上,默认情况下,Java的版本是由/usr/libexec/java_home指定的。

因此,首先需要将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发生变化时可能会出现错误。然而,改进应该比以前更好了。