无法在 MacOS Mojave 和 R 3.5.2 上加载 rJava

Can't load rJava on MacOS Mojave and R 3.5.2

我已经问过 a similar question before, but didn't get any answers that I could actually implement. I've also read the answers and ,但无法实现其中任何一个(部分原因是没有答案实际上会追溯其所有步骤。

问题

尝试在 R 3.5.2 和 MacOS Mojave 10.14.3 上加载 rJava 时出现错误:

> 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':
  dlopen(/Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/lib/server/libjvm.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so
  Reason: image not found

尝试过的解决方案

我首先尝试了 this solution, which didn't work. Then, based on this answer,我尝试了以下方法:

在终端输入以下内容:

$ /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home

然后在 R 上尝试了以下操作:

> options("java.home"="/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home")
> 
> Sys.setenv(LD_LIBRARY_PATH='$JAVA_HOME/server')
> 
> dyn.load('/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/lib/server/libjvm.dylib')
> 
> 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':
  dlopen(/Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/lib/server/libjvm.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so
  Reason: image not found

我也试过:

> options("java.home"="/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/bin")
> Sys.setenv(LD_LIBRARY_PATH='$JAVA_HOME/server')
> dyn.load('/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/lib/server/libjvm.dylib')
> 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':
  dlopen(/Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/lib/server/libjvm.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so
  Reason: image not found

过去,我已成功降级到 R 3.1,但我不想每次想使用 rJava 时都必须这样做

我遇到了类似的问题。如果您尝试了所有这些解决方案但都没有奏效,那么最好从头开始。您不希望其中之一 "fixes" 给您带来更多问题,因为它们中的大多数都需要您更改环境变量。

这是我修复它的方法。

  1. 安装最新的JAVAJDKhttps://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  2. 运行 sudo R CMD javareconf 在终端中。不要自行更改任何环境变量。

希望对您有所帮助。

这是适合我的设置

  1. macOS 莫哈韦沙漠 - 10.14.3

  2. XQuartz - 版本 2.7.11 - https://www.xquartz.org

  1. R - 版本 5.3.2

    > R --version
    R version 3.5.2 (2018-12-20) -- "Eggshell Igloo"
    Copyright (C) 2018 The R Foundation for Statistical Computing
    Platform: x86_64-apple-darwin15.6.0 (64-bit)
    
    R is free software and comes with ABSOLUTELY NO WARRANTY.
    You are welcome to redistribute it under the terms of the
    GNU General Public License versions 2 or 3.
    For more information about these matters see
    http://www.gnu.org/licenses/.
    
  2. Java - 11.0.1

    > java -version
    java version "11.0.1" 2018-10-16 LTS
    Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
    Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)
    
  3. rJava - 从 CRAN 安装

    > > install.packages("rJava")
    --- Please select a CRAN mirror for use in this session ---
    Fontconfig warning: ignoring UTF-8: not a valid region tag
    trying URL 'https://cloud.r-project.org/bin/macosx/el-         
    capitan/contrib/3.5/rJava_0.9-10.tgz'
    Content type 'application/x-gzip' length 739259 bytes (721 KB)
    ==================================================
    downloaded 721 KB
    
    
    The downloaded binary packages are in
    /var/folders/...
    > library(rJava)
    >
    

更新

在您的情况下,在 rJava 的 installation/compilation 期间使用的 JDK 似乎丢失了。您可以从消息中看出:

dlopen(/Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/lib/server/libjvm.dylib
Referenced from: /Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so
Reason: image not found

确保此文件存在:

/Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/lib/server/libjvm.dylib

可能,它不见了。您在这里有两个选择:安装 Java 11.0.1,重新配置 R.

您可以使用 /usr/libexec/java_home -V

列出所有可用的 JVM 安装

重现最初的问题并修复它

  1. 假设我们已经删除了 JDK 11.0.1

    > pwd /Library/Java/JavaVirtualMachines
    > tree -L 1
    .
    |-- jdk-11.0.1.jdk~
    `-- jdk-11.0.2.jdk
    > java -version
    java version "11.0.2" 2019-01-15 LTS
    Java(TM) SE Runtime Environment 18.9 (build 11.0.2+9-LTS)
    Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.2+9-LTS, mixed mode)
    
  2. 让我们尝试加载rJava

    > R
    
    R version 3.5.2 (2018-12-20) -- "Eggshell Igloo"
    Copyright (C) 2018 The R Foundation for Statistical Computing
    Platform: x86_64-apple-darwin15.6.0 (64-bit)
    
    ...
    ...
    ...
    
    > 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':
      dlopen(/Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/lib/server/libjvm.dylib
      Referenced from: /Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/libs/rJava.so
      Reason: image not found
    
  3. 让我们修复它

    > sudo R CMD javareconf
    Java interpreter : /usr/bin/java
    Java version     : 11.0.2
    Java home path   : /Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home
    Java compiler    : /usr/bin/javac
    Java headers gen.: /usr/bin/javah
    Java archive tool: /usr/bin/jar
    
    trying to compile and link a JNI program
    detected JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/darwin
    detected JNI linker flags : -L$(JAVA_HOME)/lib/server -ljvm
    clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/include/darwin  -I/usr/local/include   -fPIC  -Wall -g -O2  -c conftest.c -o conftest.o
    clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o conftest.so conftest.o -L/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/lib/server -ljvm -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
    
    
    JAVA_HOME        : /Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home
    Java library path: $(JAVA_HOME)/lib/server
    JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/darwin
    JNI linker flags : -L$(JAVA_HOME)/lib/server -ljvm
    Updating Java configuration in /Library/Frameworks/R.framework/Resources
    Done.
    
  4. 现在应该可以了

    > R
    
    R version 3.5.2 (2018-12-20) -- "Eggshell Igloo"
    Copyright (C) 2018 The R Foundation for Statistical Computing
    Platform: x86_64-apple-darwin15.6.0 (64-bit)
    
    ...
    ...
    ...
    
    > library(rJava)
    > quit()