在升级到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个回答

280

我遇到了与你相同的问题,并按照相同的步骤进行了操作。让RStudio能够通过Finder/Spotlight启动的最后一步是将libjvm.dylib链接到/usr/local/lib目录:

sudo ln -f -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib

添加了-f标记以强制覆盖现有的文件/链接。


4
尝试解决从El Capitan升级到Sierra时出现的相同问题。+1 - Murta
2
这解决了很多问题,特别是如果原始错误来自于cannot jfindclass[[1]],可能来自于rJava和JDBC驱动程序。 - Jenks
1
每次我在我的Macbook Pro上更新Java时,我都必须运行这个命令。它仍然可以在macOS Sierra 10.12.5和Java版本8更新141上工作。 - thiagoveloso
11
这对我来说几乎有效。此外,我还需要在R框架中添加一个符号链接指向/usr/local/lib/libjvm.dylib文件,因为/usr/local/lib/似乎不在@rpath上。例如:ln -s /usr/local/lib/libjvm.dylib /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/ - Dave X
1
这可能是一个有用的链接:https://github.com/snowflakedb/dplyr-snowflakedb/wiki/Configuring-R-rJava-RJDBC-on-Mac-OS-X - user2079550
显示剩余6条评论

53

在OSX El Capitan 10.11上,用户没有权限写入/usr/lib。因此,请使用以下命令:

sudo ln -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib

29

您可以通过以下方式显式地加载libjvm.dylib:

dyn.load('/Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home/jre/lib/server/libjvm.dylib')
library(rJava)

肯定是可能的,但不太方便。接受的答案可能是更好的选择。不过,为提供另一种选择而点赞。 - thiagoveloso

27

在macOS High Sierra(10.13.1)和Java版本9上,您需要使用稍微不同的JVM路径(请注意与早期Java版本的说明相比路径中缺少jre文件夹):

sudo ln -f -s $(/usr/libexec/java_home)/lib/server/libjvm.dylib /usr/local/lib

你还需要通知R关于JVM:

MY_R_VERSION=$(Rscript -e "cat(with(R.version, sprintf('%s.%s', major, substring(minor, 1, 1))))")
ln -s /usr/local/lib/libjvm.dylib /Library/Frameworks/R.framework/Versions/$MY_R_VERSION/Resources/lib/

太棒了,它起作用了!看来El Capitan的建议在Sierra上不起作用。 - KarthikS
非常感谢,这对我也起作用了。macOS High Sierra 10.13.2 - pat_krat
这对我很有帮助。我没有做notify R部分,但它仍然有效。非常感谢 :) - Harish

16

以下命令有效:

sudo ln -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib

在此之后,在 RStudio 中,加载 rJava 通过加载 "xlsx" 包来实现。

library("xlsx")

附注1:环境为Mac OS X El Capitan 10.11.3+,使用RStudio 0.99.491+和R 3.2.3+。(我现在还测试了macOS Sierra (10.12)和R.3.3.1.)

附注2:我发现openxlsx速度更快且不依赖于Java工作,所以现在我使用该软件包。希望这能帮到其他人。


1
谢谢你,我的朋友,你救了我的一天。我尝试了其他找到的解决方案,但这是解决我的问题的方法。 - Matteo De Felice
1
另一位使用MacGUI的El Cap用户表示感谢。由于之前尝试按照安装Java运行时1.6的说明进行操作未能解决问题,因此首先尝试了这种方法,因为它似乎最简单,结果pkg:rJava和依赖包XLConnect立即成功安装。可能需要安装从Oracle链接到苹果页面的旧版Java 1.6。 - IRTFM
1
你好,你的建议在MacOS High Sierra上也适用,感谢您!! - user8193079
1
openxlsx 万岁! - iled
是的!@iled:我同意,最好还是使用openxlsx - Sander W. van der Laan

7

您应该能够使用CRAN rJava,无需重新编译 rJava 或进行任何其他步骤,只需将共享库链接到R框架库目录即可。

sudo ln -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /Library/Frameworks/R.framework/Libraries

6

以下是我如何在两台运行Mac OS X El Capitan (10.11.6)的Mac上正确配置它的方法:

  1. Uninstall 'rJava' by issuing the following commands in a terminal window:

    Rscript -e 'remove.packages("rJava")'
    sudo Rscript -e 'remove.packages("rJava")'
    
  2. Download and install the Java software from Oracle: https://www.java.com/en/download/mac_download.jsp

  3. Add the following lines to /Users/<userid>/.bashrc using your favorite editor:

    # Set JAVA_HOME so rJava package can find it
    export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)/jre
    
  4. Close and restart any terminal, R, and RStudio windows (to pick up the changes to .bashrc).

  5. Run the following command in a Terminal window:

    sudo ln -sf $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib
    
  6. Run the following command in a Terminal window:

    sudo Rscript -e 'install.packages("rJava", repos="http://rforge.net", type="source")'
    

我在进行操作时遇到了licuuc库/链接器错误,您能解释一下吗?试图在macOS Sierra系统上安装,更多详情请点击此处(之前是在El Capitan系统中)。 - hhh

5

以下是简单的步骤:

  1. 删除rJava包:remove.packages(rJava)
  2. 关闭R
  3. 在您的Mac上安装最新的Java
  4. 打开终端并输入此命令:sudo R CMD javareconf
  5. 打开R并使用此命令安装rJava:

    install.packages("rJava", dependencies=TRUE, type="source")


我在来这里之前就已经做过了。它让我的rjava依赖库安装了,但无法启动。将libjvm.dylib链接到/usr/local/lib也使其启动了 :) - jonalv

3
在安装最新的Java SE 10 JDK后,OSX High Sierra系统中出现了图像未找到的问题。 使用在rJava Github问题页面上找到的解决方法,我已经成功解决了rJava的路径问题:R CMD javareconf JAVA_CPPFLAGS=-I/System/Library/Frameworks/JavaVM.framework/Headers。请查看此链接:https://github.com/s-u/rJava/issues/78

1

检查libjvm.dylib文件的位置。

尝试这个,在我的情况下这个方法有效:

dyn.load('/Library/Java/JavaVirtualMachines/jdk-10.jdk/Contents/Home/lib/server/libjvm.dylib')
library(rJava)

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