【问题标题】:How can I make rJava use the newer version of java on osx?如何让 rJava 在 osx 上使用更新版本的 java?
【发布时间】:2015-01-12 22:52:51
【问题描述】:

我正在关注这个关于 rJava 的教程:http://cran.r-project.org/web/packages/helloJavaWorld/vignettes/helloJavaWorld.pdf

我已经按照教程中的说明制作了所有文件并安装了 helloJavaWorld 包,但是一旦我运行 helloJavaWorld() 函数,它就会报错:

> helloJavaWorld()
Error in .jnew("HelloJavaWorld") :
  java.lang.UnsupportedClassVersionError: HelloJavaWorld : Unsupported major.minor version 52.0

所以我尝试检查 rJava 使用的 java 版本:

.jinit()
jvm = .jnew("java.lang.System")
jvm.props = jvm$getProperties()$toString()
jvm.props <- strsplit(gsub("\\{(.*)}", "\\1", jvm.props), ", ")[[1]]
jvm.props

 [1] "java.runtime.name=Java(TM) SE Runtime Environment"
 [2] "sun.boot.library.path=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Libraries"
 [3] "java.vm.version=20.65-b04-466.1"
 [4] "awt.nativeDoubleBuffering=true"
 [5] "gopherProxySet=false"
 [6] "mrj.build=11M4716"
 [7] "java.vm.vendor=Apple Inc."
 [8] "java.vendor.url=http://www.apple.com/"
 [9] "path.separator=:"
[10] "java.vm.name=Java HotSpot(TM) 64-Bit Server VM"
[11] "file.encoding.pkg=sun.io"
[12] "user.country=US"
[13] "sun.os.patch.level=unknown"
[14] "java.vm.specification.name=Java Virtual Machine Specification"
[15] "user.dir=/private/tmp"
[16] "java.runtime.version=1.6.0_65-b14-466.1-11M4716"
[17] "java.awt.graphicsenv=apple.awt.CGraphicsEnvironment"
[18] "java.endorsed.dirs=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/endorsed"
[19] "os.arch=x86_64"
[20] "java.io.tmpdir=/var/folders/5d/44ctbbln4dsflgzxph1dm8wr0000gn/T/"
[21] "line.separator=\n"
[22] "java.vm.specification.vendor=Sun Microsystems Inc."
[23] "os.name=Mac OS X"
[24] "sun.jnu.encoding=MacRoman"
[25] "java.library.path=.:/Users/kaiyin/Library/Java/Extensions:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java"
[26] "java.specification.name=Java Platform API Specification"
[27] "java.class.version=50.0"
[28] "sun.management.compiler=HotSpot 64-Bit Tiered Compilers"
[29] "os.version=10.10"
[30] "http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16"
[31] "user.home=/Users/kaiyin"
[32] "user.timezone="
[33] "java.awt.printerjob=apple.awt.CPrinterJob"
[34] "file.encoding=MacRoman"
[35] "java.specification.version=1.6"
[36] "java.class.path=/Library/Frameworks/R.framework/Versions/3.1/Resources/library/rJava/java/boot:/Library/Frameworks/R.framework/Versions/3.1/Resources/library/helloJavaWorld/java"
[37] "user.name=kaiyin"
[38] "java.vm.specification.version=1.0"
[39] "java.home=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home"
[40] "sun.arch.data.model=64"
[41] "user.language=en"
[42] "java.specification.vendor=Sun Microsystems Inc."
[43] "awt.toolkit=apple.awt.CToolkit"
[44] "java.vm.info=mixed mode"
[45] "java.version=1.6.0_65"
[46] "java.ext.dirs=/Users/kaiyin/Library/Java/Extensions:/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext"
[47] "sun.boot.class.path=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jsfd.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Resources/Java/JavaRuntimeSupport.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/ui.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/laf.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/sunrsasign.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jsse.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jce.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/charsets.jar"
[48] "java.awt.headless=true"
[49] "java.vendor=Apple Inc."
[50] "file.separator=/"
[51] "java.vendor.url.bug=http://bugreport.apple.com/"
[52] "sun.io.unicode.encoding=UnicodeLittle"
[53] "sun.cpu.endian=little"
[54] "mrj.version=1070.1.6.0_65-466.1"
[55] "socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16"
[56] "ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16"
[57] "sun.cpu.isalist="

看起来它使用 java 1.6(预装在 OSX 上),但我用 java 1.8 编译了 HelloJavaWorld 类,这导致了一个问题:如何让 rJava 使用较新版本的 java?

R CMD javareconf 的输出:

Java interpreter : /usr/bin/java
Java version     : 1.8.0_25
Java home path   : /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre
Java compiler    : /usr/bin/javac
Java headers gen.: /usr/bin/javah
Java archive tool: /usr/bin/jar
Non-system Java on OS X

trying to compile and link a JNI progam
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/jdk1.8.0_25.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c conftest.c -o conftest.o
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -o conftest.so conftest.o -L/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/server -ljvm -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation


JAVA_HOME        : /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre
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.

/Library/Frameworks/R.framework/Versions/3.1/Resources/etc/javaconf 的内容

## Versions from settings when configure was run
: ${JAVA_HOME=}
: ${JAVA_CPPFLAGS=~autodetect~}
: ${JAVA_LD_LIBRARY_PATH=~autodetect~}
: ${JAVA_LIBS=~autodetect~}

/Library/Frameworks/R.framework/Versions/3.1/Resources/etc/ldpaths 的内容

➜  etc  cat ldpaths
: ${JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre}
: ${R_JAVA_LD_LIBRARY_PATH=${JAVA_HOME}/lib/server}
if test -n ""; then
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib:}
else
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib}
fi
if test -n "${R_JAVA_LD_LIBRARY_PATH}"; then
  R_LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}:${R_JAVA_LD_LIBRARY_PATH}"
fi
## This is DYLD_FALLBACK_LIBRARY_PATH on Darwin (OS X) and LD_LIBRARY_PATH elsewhere
if test -z "${DYLD_FALLBACK_LIBRARY_PATH}"; then
  DYLD_FALLBACK_LIBRARY_PATH="${R_LD_LIBRARY_PATH}"
else
  DYLD_FALLBACK_LIBRARY_PATH="${R_LD_LIBRARY_PATH}:${DYLD_FALLBACK_LIBRARY_PATH}"
fi
export DYLD_FALLBACK_LIBRARY_PATH

【问题讨论】:

  • 尝试从命令行运行R CMD javareconf 并查看它是否检测到您的新安装。另请参阅您的安装目录R_HOME/etc 下的ldpathsMakeconf 文件。
  • ldpath 和这个有什么关系?
  • 好的。我已经用你提到的信息更新了这个问题。似乎 R 知道我的系统上存在 java 1.8。
  • /jre/ 是从 JAVA_HOME 采购的正确位置吗?它没有像 `JAVAc~ 这样的其他一些东西,我开始认为这对 R 来说可能很重要。

标签: java r rjava


【解决方案1】:

我遇到了类似的问题,但这个解决方案对我不起作用。我最终让它工作了,但现在我不确定我改变的哪些东西解决了这个问题。这是我所做的:

  1. 我在.bash_profile 中添加了以下几行:

    export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre"
    export LD_LIBRARY_PATH=/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/server 
    export PATH=$PATH:$JAVA_HOME/bin
    
  2. 我在 R 中设置了 java.home 选项和 DYLD_FALLBACK_LIBRARY_PATH 环境变量:

    options(java.home="/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk")
    Sys.setenv(DYLD_FALLBACK_LIBRARY_PATH="/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/server/")
    
  3. 为了以防万一,我重新安装了 Apple 的 Java 1.6 版本,根据这个问题线程:https://github.com/s-u/rJava/issues/37

  4. 我重新配置了 R 的 java 设置。在 Bash 中:R CMD javareconf
  5. 我以 root 身份运行 R,然后直接从 RForge 从源代码安装 rJava。在 Bash 中:sudo R。然后在 R 会话中:install.packages('rJava',,'http://www.rforge.net/')

从源代码安装对于使 rJava 采用 R 的新 Java 设置至关重要。当我没有从源代码安装时,rJava 可以安装,但它会继续使用 JRE 1.6。您可以通过运行检查使用哪个 JRE rJava:

library(rJava)
.jinit()
.jcall("java/lang/System", "S", "getProperty", "java.runtime.version")

以 root 身份运行 R 对于从 RForge 源正确安装 rJava 至关重要。当我尝试以用户身份运行 install.packages('rJava',,'http://www.rforge.net/') 时,我收到以下错误消息:

  • 如果在命令行中运行 R,rJava 将无法正确安装:

    checking JNI data types... configure: error: One or more JNI types differ from the corresponding native type. You may need to use non-standard compiler flags or a different compiler in order to fix this.
    ERROR: configuration failed for package ‘rJava’
    
  • 如果从 Finder 将 R 作为应用程序运行,rJava 会安装,但不会加载:

    > 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’
    

希望这个答案可以为其他人节省一些时间!

编辑添加: 我的两位教授按照这些说明操作并遇到了以下问题:rJava 在命令行中运行 R 时可以工作,但在运行 RStudio 或默认设置时无法加载Mac R 应用程序。

Joe Ramsey 找到了解决方案。他写道:

显然,RStudio 抱怨必须使用 Apple 用来打开应用程序的默认用户/目录。

本文描述:http://jeromyanglim.tumblr.com/post/34221143729/how-to-run-rstudio-from-the-command-line-on-osx

[解决问题]您转到命令行并键入: open -a rstudioopen -a R

第二个编辑:我刚刚在其中一台学校计算机上安装了 rJava,运行 Ubuntu 14.04.4 LTS(64 位)。以 root 身份运行 R 时,我能够安装 rJava。然而,当我尝试以用户身份运行 R 并加载包时,我得到了一个全新的加载错误:

> library(rJava)
Error : .onLoad failed in loadNamespace() for 'rJava', details:
    call: dyn.load(file, DLLpath = DLLpath, ...)
    error: unable to load shared object '/home/lizziesilver/R/x86_64-pc-linux-gnu-library/3.2/rJava/libs/rJava.so':
    libjvm.so: cannot open shared object file: No such file or directory
  Error: package or namespace load failed for ‘rJava’

我检查了目录; rJava.so 肯定存在。原来我没有正确的权限:

...$ ls -l /home/lizziesilver/R/x86_64-pc-linux-gnu-library/3.2/rJava/libs/rJava.so
-rwxr-xr-x 1 root root 353325 Feb 26 16:58 /usr/lib/R/library/rJava/libs/rJava.so

所以我更改了权限: sudo chmod -R a+rX /home/lizziesilver/R/x86_64-pc-linux-gnu-library/3.2/rJava/

然后重新配置R的java设置:

export LD_LIBRARY_PATH=/usr/lib/jvm/java-8-oracle/lib/amd64:/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server
sudo R CMD javareconf

现在 rJava 加载,即使以用户而不是 root 运行 R!

rJava:不断提供的包(配置错误)

【讨论】:

  • 魔鬼在细节中!感谢您撰写此详细答案
  • 此方法还可以让闪亮服务器在 ubuntu 机器上获取 java-14 配置。 (它只使用“R CMD JAVARECONF”来运行 R 并在命令行中使用 xlsx,但在闪亮服务器中,正确的 conf 没有被拾取!
【解决方案2】:

在 SO 上有很多关于 rJava 的相互矛盾的信息。我对很多这些答案的担忧是,一旦你开始使用JAVA_HOME 变量,你就会冒着完全破坏Java 安装的风险——解决方案可能比疾病更糟糕。如果您遇到 rJava 问题,以下是您可以做的“不伤害”事情的简要说明。

1) 在终端中,运行R CMD javareconf。这是由 R Core 编写的脚本,它将“检测当前的 Java 设置并更新 R 中的相应配置”。看看内部here

2) 从源代码重新安装 rJava。 install.packages("rJava", type = "source").

3) 从命令行打开 R。加载 rJava。从命令行 (directions) 打开 RStudio。加载 rJava。你得到同样的错误吗?如果没有,那太好了——你越来越暖和了!您已将问题与 RStudio 隔离,而不是 R 本身。

4) RStudio 和 rJava 存在某种问题,这与 - 实际上,你知道吗,我什至不会尝试完成那句话,因为坦率地说,这超出了我的工资等级。动态库什么的。

网上有很多关于此的文章(hereherehereand here)。我最喜欢的标题是“the rJava nightmare”。

您的里程可能会有所不同,this 我只需要答案就可以让 RStudio 玩得很好——终端上的一行代码,它所做的只是创建一个符号链接.无需更改权限,无需修改环境变量 - 只是一个简单的符号链接。

如果这不适合您,我建议您先阅读上面链接的博客文章,然后再开始复制/粘贴大量这对我有用散落在 SO 上的答案。 p>

【讨论】:

  • 符号链接非常适合在“运行时”加载 rJava,但是,在使用 devtools 构建包期间加载 rJava 失败。知道为什么吗?
  • 我必须在构建之前执行 install.packages('rJava') ,然后在运行我的包中的函数之前再次 install.packages('rJava', type="source") !
  • 我也面临同样的问题。如何运行“R CMD javareconf”命令?我使用的是 Windows 7。在输入 cmd.exe 时,无法识别命令“R”。我必须在特定目录中吗?
  • @NashVio R 可能不在您的 PATH 中,因此 windows 无法识别 - stackoverflow.com/a/10077744/561698
【解决方案3】:

这是一个对我来说非常有用的解决方案:

  1. 在终端运行: R CMD javareconf

  2. 从输出中获取 JAVA_HOME 路径和 Java 库路径 示例

JAVA_HOME : /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre Java 库路径:$(JAVA_HOME)/lib/server JNI cpp 标志:-I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/darwin JNI 链接器标志:-L$(JAVA_HOME)/lib/server -ljvm 更新 /Library/Frameworks/R.framework/Resources 中的 Java 配置

  1. 然后,确保您没有打开的 RStudio 实例。我们将创建一个别名,该别名将使用最新 Java 版本的正确路径打开 RStudio。在你的推荐行中运行它

别名 rstudio="DYLD_FALLBACK_LIBRARY_PATH=/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/server open -a RStudio"

  1. 在终端中输入 rstudio

  2. 完成! Rstudio 将打开指向正确的 java 版本

【讨论】:

    【解决方案4】:

    我通过从 RForge 上的最新源包安装解决了这个问题:http://www.rforge.net/rJava/files/

    cd /tmp
    wget http://www.rforge.net/rJava/snapshot/rJava_0.9-7.tar.gz
    R CMD INSTALL rJava_0.9-7.tar.gz
    

    在 R 中:

    > library(helloJavaWorld)
    Loading required package: rJava
    > helloJavaWorld()
    [1] "Hello from java!"
    

    【讨论】:

    • 对于 Mac OS X El Capitan (10.11),我必须执行与此处相同的操作。我需要从最新的开发风格下载。但它是 0.9-8,因为 El Capitan 弄乱了环境变量,只有开发版本解决了这个问题。
    • 我已经安装了 0.9.9 版本,现在可以在终端下运行。但是,如果我打开 rstudio(使用“open -a”或单击图标),我会得到:错误:.onLoad failed in loadNamespace() for 'rJava', details: call: dyn.load(file, DLLpath = DLLpath, .. .) 等等等等。
    猜你喜欢
    • 1970-01-01
    • 2014-05-28
    • 2013-02-10
    • 2017-07-09
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多