【问题标题】:rJava load error in RStudio/R after "upgrading" to OSX Yosemite“升级”到 OSX Yosemite 后,RStudio/R 中的 rJava 加载错误
【发布时间】:2015-08-24 16:19:35
【问题描述】:

我最近从 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 的包,它似乎可以工作(或者至少我没有收到任何错误消息)。

我尝试了许多不同的尝试修复,其中一些尝试了几次,但我不太记得我按什么顺序做了什么(没有意识到这会是一个如此糟糕的问题,而且不是真的跟踪),但这里是它的要点:

  • 将以下内容添加到我的.bash_profile(根据this SO answer):

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

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

    sudo R CMD javareconf -n

  • 检查了options("java.home"),发现它被设置为NULL。我尝试将其设置为以下(每个this SO question):

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

  • 安装了最新的 Java 开发工具包并从源代码重新安装了 rJava(不记得我在哪里找到的)。

在尝试所有这些时,我能够加载rJava 而不会导致 R 崩溃,但收到了上面发布的错误消息。另外,当我退出RStudio时,它似乎正常关闭,但随后会弹出“RStudio意外退出”消息,表明程序在尝试关闭时崩溃了。

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

在查看我已经看过的一些帖子时,我注意到我之前错过的another SO answer,它建议使用以下命令行代码打开 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 工作。但是,我想找到一种方法来解决潜在的问题,无论它可能是什么,以便可以以通常的 Mac 方式打开 RStudio,而无需使用命令行。我还担心安装旧版本的 Java 可能会导致问题。

有人对如何诊断和解决此问题有任何想法吗?

【问题讨论】:

  • 这个解决方案在 El Capitan 中仍然适用于您吗?我在使用 LD_LIBRARY_PATH=$(/usr/libexec/java_home)/jre/lib/server: open -a RStudio 技巧之前得到了这个工作,但它不再工作了。我已经wrote a blog post regarding this issue 并在那里描述了这个问题。我想知道其他人是否在此配置中也遇到此问题,或者是我的错。
  • 我还在使用Yosemite,所以我不确定。有关El Capitan 的答案,请参见下文。
  • 好的,我想我会发布一个新问题。是的,只要RStudio 按预期加载rJava,下面的El Capitan 解决方案就会很有帮助。
  • 重启 RStudio 后它工作了
  • 在诊断时,尝试otool -L /Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/libs/rJava.so 获取共享库的列表以及如何解决它们。我不确定如何发现@rpath 的运行时内容。

标签: java r rstudio rjava macos-high-sierra


【解决方案1】:

我遇到了同样的问题,并经历了与您相同的步骤。允许通过 Finder/Spotlight 启动 RStudio 的最后一步是将 libjvm.dylib 链接到 /usr/local/lib:

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

添加-f标志以强制覆盖现有文件/链接

【讨论】:

  • 在完成从 El Capitan 到 Sierra 的升级后解决了同样的问题。 +1
  • 这样解决了很多问题;特别是如果原始错误来自 cannot jfindclass[[1]] 可能来自 rJava 和 JDBC 驱动程序
  • 每次在 Macbook Pro 上更新 Java 时,我都必须运行此命令。它仍然适用于 macOS Sierra 10.12.5 和 Java 版本 8 更新 141。
  • 这几乎对我有用。此外,我必须在 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/
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您可以通过类似运行方式显式加载 libjvm.dylib

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

    【讨论】:

    • 肯定可以,但不方便。接受的答案可能是一个更好的选择。 +1 提供替代方案。
    【解决方案4】:

    在 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 不起作用
    • 非常感谢,这对我也有用。 macOS High Sierra 10.13.2
    • 这对我有帮助。我没有做通知 R 部分。它仍然有效。非常感谢:)
    【解决方案5】:

    以下命令有效:

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

    之后,在 RStudio 中,通过加载“xlsx”包来加载 rJava。

    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 来工作,所以我现在正在使用那个包。希望对其他人有所帮助。

    【讨论】:

    • 谢谢你,我的朋友,你拯救了我的一天。我尝试了其他解决方案,但这是解决我的问题的解决方案。
    • 另一位 El Cap 用户(但使用 MacGUI)表示感谢。从一开始就尝试了这个,因为它看起来最简单(并且早期的安装 Java 运行时 1.6 的努力没有解决问题)并且 pkg:rJava 和依赖项 pkg;XLConnect 立即成功。可能需要安装 Oracle 提供并从 Apple 页面链接的旧版 Java 1.6。
    • 您好,您的建议也适用于 MacOS High Sierra,非常感谢!!
    • openxlsx FTW!
    • 是的! @iled:我同意,最好还是使用openxlsx
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

      这是我配置它在两台运行 Mac OS X El Capitan (10.11.6) 的 Mac 上正常工作的方式:

      1. 通过在终端窗口中发出以下命令来卸载“rJava”:

        Rscript -e 'remove.packages("rJava")'
        sudo Rscript -e 'remove.packages("rJava")'
        
      2. 从 Oracle 下载并安装 Java 软件:https://www.java.com/en/download/mac_download.jsp

      3. 使用您喜欢的编辑器将以下行添加到/Users/<userid>/.bashrc

        # Set JAVA_HOME so rJava package can find it
        export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)/jre
        
      4. 关闭并重新启动所有终端、R 和 RStudio 窗口(以获取对 .bashrc 的更改)。

      5. 在终端窗口中运行以下命令:

        sudo ln -sf $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib
        
      6. 在终端窗口中运行以下命令:

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

      【讨论】:

      • 我在执行此操作时遇到 licuuc 库/链接器错误,您能解释一下吗?尝试在 macOS Sierra 上安装,更多 here(El Capitan 早期)。
      【解决方案8】:

      以下是它的简单步骤:

      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 的链接使它也开始了:)
      【解决方案9】:

      使用最新 Java SE 10 JDK 在 OSX High Sierra 上全新安装时存在找不到映像的问题。

      我能够使用 rJava Github 问题页面上的修复程序解决 rJava 的路径问题:https://github.com/s-u/rJava/issues/78

      R CMD javareconf JAVA_CPPFLAGS=-I/System/Library/Frameworks/JavaVM.framework/Headers

      【讨论】:

        【解决方案10】:

        这在 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")

        祝你好运。

        【讨论】:

          【解决方案11】:

          也许是另一个不会触及您的文件系统的简单答案:

          $ 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

          (用您的 JDK 路径替换 jdk1.8.0_131.jdk。)

          【讨论】:

          • 我有自制 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。我可以看到otool -l /usr/local/lib/R/3.3/site-library/rJava/libs/rJava.so | grep LC_RPATH 缺少 rpath
          • @Ian 也许你知道这个here 的解决方案,我已经用 Homebrew 安装了 Java,现在正试图让 rJava 工作。想法?
          【解决方案12】:

          检查 libjvm.dylib 文件的位置。

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

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

          【讨论】:

            【解决方案13】:

            我完成了所有我能找到的故障排除,然后安装了 jdk-11.0.1_osx-x64_bin.dmg 来自:Oracle downloads

            之后一切都很顺利。

            检查运行 library('rJava') 时未加载的库的版本,并将其与需要安装的 java 版本匹配。

            【讨论】:

              【解决方案14】:

              我注意到在 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”没有问题。

              【讨论】:

                【解决方案15】:

                您可以在此处下载 El Capitan 的旧版 Java 版本 6:https://support.apple.com/kb/DL1572?viewlocale=en_US&locale=en_US 这样做之后,rJava 包对我有用。

                【讨论】:

                  【解决方案16】:

                  下面的这一行解决了我在使用rJava 包时遇到的问题,就像本次讨论中的其他人一样。我敢肯定这个问题有不止一种解决方案,我真诚地感谢他们所有人的贡献,因为有时像下面这样的一行代码可以节省大量时间,以免浪费时间!

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

                  【讨论】:

                    【解决方案17】:

                    在命令行运行以下命令: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
                    【解决方案18】:

                    您可以使用以下命令更改 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
                    

                    【讨论】:

                      猜你喜欢
                      • 2020-02-05
                      • 2014-12-14
                      • 2014-12-16
                      • 2017-10-24
                      • 2019-10-06
                      • 2014-11-09
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多