如何让 rJava 在 osx 上使用较新版本的 java?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26948777/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I make rJava use the newer version of java on osx?
提问by qed
I am following this tutorial on rJava: http://cran.r-project.org/web/packages/helloJavaWorld/vignettes/helloJavaWorld.pdf
我正在关注有关 rJava 的本教程:http://cran.r-project.org/web/packages/helloJavaWorld/vignettes/helloJavaWorld.pdf
I have made all the files as specified in the tutorial and installed the helloJavaWorld package, but once I run the helloJavaWorld() function, it complains:
我已经制作了教程中指定的所有文件并安装了 helloJavaWorld 包,但是一旦我运行 helloJavaWorld() 函数,它就会抱怨:
> helloJavaWorld()
Error in .jnew("HelloJavaWorld") :
java.lang.UnsupportedClassVersionError: HelloJavaWorld : Unsupported major.minor version 52.0
So I tried to check the java version that rJava is using:
所以我试图检查 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="
It looks like it uses java 1.6 (preinstalled on OSX), but I compiled the HelloJavaWorld class with java 1.8, which leads to the question: How can I make rJava use the newer version of java?
看起来它使用 java 1.6(预装在 OSX 上),但我用 java 1.8 编译了 HelloJavaWorld 类,这导致了一个问题:如何让 rJava 使用较新版本的 java?
Output of R CMD javareconf
:
的输出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.
Content of /Library/Frameworks/R.framework/Versions/3.1/Resources/etc/javaconf
/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~}
Content of /Library/Frameworks/R.framework/Versions/3.1/Resources/etc/ldpaths
/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
回答by Andrew
There's a lot of conflicting info about rJava on SO. My concern with a lot of these answers was that once you start monkeying with the JAVA_HOME
variables, you run the risk of borking your Java install completely -- the solution can be worse than the disease. Here's a quick rundown of 'do no harm' things you can do if you are having rJava problems.
关于 SO 上的 rJava 有很多相互矛盾的信息。我对许多这些答案的担忧是,一旦您开始使用JAVA_HOME
变量,您就会冒着完全中断 Java 安装的风险——解决方案可能比疾病更糟糕。如果您遇到 rJava 问题,以下是您可以做的“无害”事情的简要概述。
1) in the terminal, run R CMD javareconf
. This is a script written by R Core that will "Detect current Java setup and update the corresponding configuration in R." Take a look at the internals here.
1) 在终端中,运行R CMD javareconf
. 这是一个由 R Core 编写的脚本,它将“检测当前的 Java 设置并更新 R 中的相应配置”。看看这里的内部结构。
2) re-install rJava from source. install.packages("rJava", type = "source")
.
2) 从源代码重新安装 rJava。install.packages("rJava", type = "source")
.
3) Open R from the command line. Load rJava. Open RStudiofrom the command line (directions). Load rJava. Do you get the same error? If not, great - you're getting warmer! You've isolated your problem to an issue with RStudio, not R itself.
3) 从命令行打开 R。加载 rJava。从命令行(方向)打开RStudio。加载 rJava。你有同样的错误吗?如果没有,太好了 - 你越来越暖和了!您已将您的问题与RStudio问题隔离,而不是 R 本身。
4) There's some sort of issue with RStudio and rJava that relates to - actually, you know what, I'm not even going to try to finish that sentence, because frankly it's above my pay grade. Dynamic libraries something something.
4) RStudio 和 rJava 存在某种与相关的问题 - 实际上,你知道吗,我什至不打算完成这句话,因为坦率地说,它高于我的工资等级。动态库的东西。
There are a bunch of writeups (here, here, here, and here) on the web about this. My favorite title was "the rJava nightmare."
还有一堆writeups(的这里,这里,这里,这里)这个在网络上。我最喜欢的标题是“ rJava 噩梦”。
Your mileage may vary,but thisSO answer was all I needed to get RStudio to play nice -- one line of code on the terminal, and all it does is creates a symbolic link. No changes to permissions, no modification of environment variables - just a simple symlink.
你的里程可能会有所不同,但这个SO 答案是我让 RStudio 发挥良好所需要的全部 - 终端上的一行代码,它所做的就是创建一个符号链接。没有更改权限,没有修改环境变量 - 只是一个简单的符号链接。
If that doesn't do it for you, I'd suggest reading the linked blog posts above before you start copy/pasting the multitude of this worked for meanswers littered across SO.
如果这对您不起作用,我建议您在开始复制/粘贴之前阅读上面链接的博客文章,其中大量对我有用的答案散落在 SO 中。
回答by Lizzie Silver
I had a similar problem, but this solution didn't work for me. I eventually got it working, but now I'm not sure which of the things I changed solved the problem. Here's what I did:
我有一个类似的问题,但这个解决方案对我不起作用。我最终让它工作了,但现在我不确定我改变了哪些东西解决了问题。这是我所做的:
I added the following lines to my
.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
I set my
java.home
option and myDYLD_FALLBACK_LIBRARY_PATH
environmental variable in R: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/")
I re-installed Apple's version of Java 1.6 just in case, as per this issue thread: https://github.com/s-u/rJava/issues/37
- I reconfigured R's java settings. In Bash:
R CMD javareconf
- I ran R as root, and then installed rJava from source, directly from RForge. In Bash:
sudo R
. Then in the R session:install.packages('rJava',,'http://www.rforge.net/')
.
我添加了以下几行到我的
.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
我在 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/")
我重新安装了 Apple 的 Java 1.6 版本,以防万一,按照这个问题线程:https: //github.com/su/rJava/issues/37
- 我重新配置了 R 的 java 设置。在 Bash 中:
R CMD javareconf
- 我以 root 身份运行 R,然后直接从 RForge 从源代码安装 rJava。在bash:
sudo R
。然后在R对话:install.packages('rJava',,'http://www.rforge.net/')
。
Installing from source was crucial to making rJava pick up on R's new Java settings. When I didn't install from source, rJava would install ok, but it would continue to use JRE 1.6. You can check which JRE rJava uses by running:
从源代码安装对于使 rJava 接受 R 的新 Java 设置至关重要。当我没有从源代码安装时,rJava 可以安装,但它会继续使用 JRE 1.6。您可以通过运行以下命令来检查哪些 JRE rJava 使用:
library(rJava)
.jinit()
.jcall("java/lang/System", "S", "getProperty", "java.runtime.version")
Running R as root was crucial to making rJava install correctly from the RForge source. When I tried to run install.packages('rJava',,'http://www.rforge.net/')
as User, I got the following error messages:
以 root 身份运行 R 对于从 RForge 源正确安装 rJava 至关重要。当我尝试以install.packages('rJava',,'http://www.rforge.net/')
用户身份运行时,收到以下错误消息:
If running R in the command line, rJava would not install correctly:
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'
If running R as an application from Finder, rJava would install, but not load:
> 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 将无法正确安装:
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'
Hopefully this answer will save someone else some time!
希望这个答案可以为其他人节省一些时间!
Edited to add:Two of my professors followed these instructions and ran into the following issue: rJava would work when running R in the command line, but would fail to load when running RStudio or the default Mac R app.
编辑添加:我的两位教授遵循了这些说明并遇到了以下问题:在命令行中运行 R 时 rJava 可以工作,但在运行 RStudio 或默认的 Mac R 应用程序时无法加载。
Joe Ramseyfigured out the solution. He writes:
乔拉姆齐想出了解决办法。他写:
Apparently RStudio grumbles about having to use the default user/directory that Apple uses to open applications.
This article describes it: http://jeromyanglim.tumblr.com/post/34221143729/how-to-run-rstudio-from-the-command-line-on-osx
[To fix the issue] You go to the command line and type:
open -a rstudio
oropen -a R
显然,RStudio 抱怨必须使用 Apple 用来打开应用程序的默认用户/目录。
本文对其进行了描述:http: //jeromyanglim.tumblr.com/post/34221143729/how-to-run-rstudio-from-the-command-line-on-osx
[解决问题]您转到命令行并键入:
open -a rstudio
或open -a R
Edit number two: I just installed rJava on one of the school computers, running Ubuntu 14.04.4 LTS (64-bit). I was able to install rJava when running R as root. However, when I then tried to run R as user and load the package, I got a brand new loading error:
第二个编辑:我刚刚在其中一台运行 Ubuntu 14.04.4 LTS(64 位)的学校计算机上安装了 rJava。以 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'
I checked the directory; rJava.so definitely existed. It turned out that I didn't have the right permissions for it:
我检查了目录;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
So I changed the permissions:
sudo chmod -R a+rX /home/lizziesilver/R/x86_64-pc-linux-gnu-library/3.2/rJava/
所以我改变了权限:
sudo chmod -R a+rX /home/lizziesilver/R/x86_64-pc-linux-gnu-library/3.2/rJava/
Then reconfigured R's java settings:
然后重新配置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
Now rJava loads, even when running R as user instead of root!
现在 rJava 加载,即使在以用户而不是 root 身份运行 R 时!
rJava: the package that keeps on giving (config errors)
rJava:不断给出的包(配置错误)
回答by qed
I solved the problem by installing from the latest source package on RForge: http://www.rforge.net/rJava/files/
我通过从 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
In R:
在 R 中:
> library(helloJavaWorld)
Loading required package: rJava
> helloJavaWorld()
[1] "Hello from java!"
回答by nadia
Here is a solution that worked pretty good for me:
这是一个对我来说非常有用的解决方案:
In the terminal run: R CMD javareconf
Get the JAVA_HOME path and the Java library path from the output Example
在终端运行:R CMD javareconf
从输出示例中获取 JAVA_HOME 路径和 Java 库路径
JAVA_HOME : /Library/Java/JavaVirtualMachines/jdk1.8.0_65.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
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 配置
- Then, make sure you don't have an open instance of RStudio. We'll create an alias that will open RStudio with the correct path to your latest java version. Run this in your commend line
- 然后,确保您没有 RStudio 的打开实例。我们将创建一个别名,以使用最新 Java 版本的正确路径打开 RStudio。在您的推荐行中运行它
alias rstudio="DYLD_FALLBACK_LIBRARY_PATH=/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/server open -a RStudio"
alias rstudio="DYLD_FALLBACK_LIBRARY_PATH=/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/server open -a RStudio"
Type rstudio in your terminal
Done! Rstudio will open pointing to the right java version
在终端中输入 rstudio
完毕!Rstudio 将打开指向正确的 Java 版本