在升级到OSX Yosemite后,在RStudio/R中加载rJava时出现错误

125

我最近从OSX Mountain Lion升级到Yosemite,从R 3.1.3升级到3.2。在升级后,当我打开R或RStudio时,弹出消息提示我需要安装Java 6。此外,加载rJava或任何依赖rJava的软件包(例如xlsx)会导致RStudio崩溃(当我直接打开 R.app 时,R也会崩溃)。

尝试了一些在Stack Overflow和其他地方找到的解决方法(下面有更多详细信息),现在加载rJava或任何依赖rJava的软件包不再导致R崩溃,但会导致以下错误:

library(rJava)
Error : .onLoad failed in loadNamespace() for 'rJava', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared object '/Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so':
  dlopen(/Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: @rpath/libjvm.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so
  Reason: image not found
Error: package or namespace load failed for ‘rJava’

然而,如果我从命令行调用R,然后加载rJava或任何依赖于rJava的包,它似乎可以工作(或者至少我没有收到任何错误消息)。

我尝试了很多不同的修复方式,有些尝试了几次,不能完全记得我按照什么顺序做了什么(没有意识到这将是一个如此错综复杂的问题,并且没有真正保持跟踪),但这是要点:

  • 根据这个 SO 答案 ,将以下内容添加到我的.bash_profile中:

    export JAVA_HOME="/usr/libexec/java_home -v 1.8"
    export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/server

  • 从命令行重新配置java如下:

    sudo R CMD javareconf -n

  • 检查options("java.home"),发现其设置为NULL,我尝试将其设置为以下值(根据这个 SO 问题):

    options("java.home"="/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre")

  • 安装了最新的Java Development Kit并从源代码重新安装了rJava(无法记住我在哪里找到的)。

在尝试所有这些步骤之一时,我能够在不崩溃R的情况下加载rJava,但代替地会出现上面发布的错误消息。此外,当我退出RStudio时,它似乎正常关闭,但然后会弹出“RStudio意外退出”的消息,表明程序在尝试关闭时崩溃。

最后,我决定安装Java for OS X 2014-001(Java 6),因为我似乎已经没有选择了。现在,当我打开R或RStudio时,“此软件需要Java 6”弹出消息不再出现。然而,我仍然收到上面发布的.onLoad failed in loadNamespace() for 'rJava'错误消息。

在回顾我的一些帖子时,我发现自己错过了一个SO答案,该答案建议使用以下命令行代码打开RStudio,从而为RStudio提供正确的java路径:

LD_LIBRARY_PATH=$(/usr/libexec/java_home)/jre/lib/server: open -a RStudio

这打开了一个RStudio窗口,我也能够加载rJava和依赖它的软件包而不会出现错误。

最后,我尝试了一下从命令行运行R(以前没有这样做)。结果发现,在命令行上加载rJava或任何依赖于rJava的包都可以工作并且不会引发任何错误。

因此,如果我使用给出RStudio java路径的代码从命令行中打开RStudio,我现在可以使rJava运作。但是,我想找到一种方法来解决


这个解决方案在El Capitan中仍然适用吗?我之前使用LD_LIBRARY_PATH=$(/usr/libexec/java_home)/jre/lib/server: open -a RStudio的方法使其工作,但现在不再起作用了。我已经撰写了一篇关于这个问题的博客文章并在那里描述了这个问题。我想知道其他人在这个配置中是否也遇到了这个问题,或者是我的问题。 - Paul Klemm
我仍在使用Yosemite,所以不确定。请参阅下面与El Capitan相关的答案。 - eipi10
好的,我想我会发一个新的问题。是的,下面的El Capitan解决方案非常有帮助,只要RStudio按预期加载rJava即可。 - Paul Klemm
2
我重新启动了 RStudio 之后它就可以工作了。 - Pranay Aryal
在诊断时,请尝试使用“otool -L /Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/libs/rJava.so”获取共享库列表以及它们如何解决的信息。我不确定如何发现“@rpath”的运行时内容。 - Dave X
18个回答

1
也许还有一个简单的解决方案,不会触及您的文件系统: $ install_name_tool -add_rpath /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/server /Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/libs/rJava.so
(将jdk1.8.0_131.jdk替换为您的JDK路径。)

2
我有Homebrew R,并且对我有效的确切命令是:install_name_tool -add_rpath /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/jre/lib/server /usr/local/lib/R/3.3/site-library/rJava/libs/rJava.so。我能够看到rpath缺失了,使用otool -l /usr/local/lib/R/3.3/site-library/rJava/libs/rJava.so | grep LC_RPATH - Ian
@Ian 或许你知道这个链接上的解决方案,我已经使用Homebrew安装了Java,现在正在尝试让rJava工作。有什么想法吗? - hhh

1
我查阅了所有的故障排除方法,然后从Oracle下载页面安装了jdk-11.0.1_osx-x64_bin.dmg。
之后一切都运行得很完美。
在运行library('rJava')时,请检查未加载的库的版本,并将其与所需安装的Java版本匹配。

1

这是我在MAC上的解决方案:

  1. 在你的~/.profile或者~/.bashrc文件中添加以下内容: %export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home

    1.1 运行% source .profile(或者% source .bashrc

  2. % sudo ln -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib
  3. remove.packages(rJava)
  4. remove.packages(Rweka)
  5. 在终端输入以下命令: %sudo R CMD javareconf
  6. install.packages("rJava", dependencies = TRUE, type = "source")
  7. install.packages("rJava", dependencies = TRUE, type = "source")
  8. 加载你的library("rJava", "RWeka")

祝你好运。


1
我注意到在Rstudio中加载'rJava'时,对JDK版本要求非常严格。
在我的情况下(Mac OS. 10.14.6-Mojave),我安装了jdk-13,但它只能与jdk-11兼容。
我将我的JDK版本链接到一个不存在的目录,而Rstudio认为它是有效的(JDK 11):
sudo ln -sf /Library/Java/JavaVirtualMachines/jdk-13.jdk/ /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk

令人惊讶的是,它像魔法一样运作良好...
顺便说一句,在本地 R 中按照先前的说明运行 'rJava' 没有任何问题。


0

0
这行代码解决了我在讨论中遇到的与rJava包相关的问题,和其他人一样。我相信对于这个问题可能有不止一种解决方案,我真诚地感谢他们的贡献,因为有时候像下面这行代码这样的一句话可以节省很多时间,避免浪费!
sudo ln -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib

0
在命令行上运行以下代码:sudo R CMD javareconf 上面有几个解决方案提到了这一点,但他们也建议删除并随后重新安装rJava包。我发现这些额外的步骤是不必要的。

我尝试了您的解决方案 sudo R CMD javareconf,但 library(rJava) 仍然出现相同的错误: Error: package or namespace load failed for ‘rJava’: .onLoad failed in loadNamespace() for 'rJava', details: call: dyn.load(file, DLLpath = DLLpath, ...) error: unable to load shared object '/Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so': ... Reason: image not found - Lazarus Thurston

0
您可以使用以下命令在 R 中更改引用:
sudo install_name_tool -change /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/lib/server/libjvm.dylib /Library/Java/JavaVirtualMachines/jdk-13.0.1.jdk/Contents/Home/lib/server/libjvm.dylib /Library/Frameworks/R.framework/Versions/3.6/Resources/library/rJava/libs/rJava.so

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接