我在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
答案 0 :(得分:14)
在SO上有很多关于rJava的相互矛盾的信息。我对很多这些答案的关注是,一旦你开始使用JAVA_HOME
变量进行修改,就会冒着完全堵塞Java安装的风险 - 解决方案可能比疾病更糟糕。这里有一个简单的概述,“不要伤害”#39;如果你遇到rJava问题,你可以做些什么。
1)在终端中,运行R CMD javareconf
。这是由R Core编写的脚本,它将检测当前的Java设置并更新R中的相应配置。&#34;看看内部here。
2)从源代码重新安装rJava。 install.packages("rJava", type = "source")
。
3)从命令行打开R.加载rJava。从命令行(directions)打开 RStudio 。加载rJava。你得到同样的错误吗?如果没有,那很好 - 你变暖了!您已将问题与 RStudio 问题隔离,而不是R本身。
4)RStudio和rJava之间存在某种问题 - 实际上,你知道什么,我甚至都没有尝试完成那句话,因为坦率地说它是高于我的工资等级。动态库是一些东西。网上有很多关于此的写作(here,here,here,and here)。我最喜欢的标题是&#34; the rJava nightmare。&#34;
你的里程可能会有所不同,但是this所以我需要的答案就是让RStudio发挥得很好 - 终端上的一行代码,它所做的就是创建一个象征性的联系。没有对权限的更改,也没有修改环境变量 - 只是一个简单的符号链接。
如果这样做并不适合你,我建议您在开始复制/粘贴大量这对我有用的答案之前阅读上面的链接博客文章SO。
答案 1 :(得分:10)
我有类似的问题,但这个解决方案对我不起作用。我最终得到了它的工作,但现在我不确定我改变了哪些东西解决了这个问题。这是我做的:
我在.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/s-u/rJava/issues/37
R CMD javareconf
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 app。
Joe Ramsey找到了解决方案。他写道:
显然,RStudio抱怨必须使用Apple用来打开应用程序的默认用户/目录。
本文介绍了它:http://jeromyanglim.tumblr.com/post/34221143729/how-to-run-rstudio-from-the-command-line-on-osx
[解决问题]您转到命令行并输入:
open -a rstudio
或open -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:不断提供的包(配置错误)
答案 2 :(得分:2)
我通过在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!"
答案 3 :(得分:0)
这是一个对我有用的解决方案:
在终端运行中: R CMD javareconf
从输出中获取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配置别名rstudio =“DYLD_FALLBACK_LIBRARY_PATH = / Library / Java / JavaVirtualMachines / jdk1.8.0_65.jdk / Contents / Home / jre / lib / server open -a RStudio”
在终端输入rstudio
完成! Rstudio将打开指向正确的java版本