红联Linux门户
Linux帮助

Ubuntu 14.04 R上安装rJava包出错问题的解决

发布时间:2017-06-21 10:54:03来源:linux网站作者:Heavbird
启动R后,在交互终端中执行install.packages("rJava"),下载rJava包编译一会儿,报类似下面错误:
Error : .onLoad failed in loadNamespace() for 'rJava', details:
call: dyn.load(file, DLLpath = DLLpath, ...)
error: unable to load shared object '/home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava/libs/rJava.so':
libjvm.so: cannot open shared object file:No such file or directory
Error: loading failed
Execution halted
ERROR: loading failed
* removing ‘/home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava’
* restoring previous ‘/home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava’
 
起初 ls -l /home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava/libs/rJava.so,没有rJava.so没编译出来。
搜索了一番,基本都是说$JAVA_HOME没设或设置不对,再三确认,$JAVA_HOME是对的,指向环境中的jdk1.8, 并且通过
Sys.setenv(JAVA_HOME=‘/usr/lib/jvm/jdk1.8.0_131’), 也还是不行。 
 
继续查日志,注意到编译过程中-I引用的目录不是java_home所指向的目录,而是其它Java版本的路径(本机装了多个JDK),如下: 
-I/usr/lib/jvm/java-1.7.0-openjdk-amd64/jre/../include -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/jre/../include/linux
看来确实是环境变量和引用路径的问题,继续改配置:
~/.bashrc中增加: 
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$HIVE_HOME/lib:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
 
这下编译过了,rJava.so也出来了,并且是64bit的。
但是还有下面的错:libjvm.so 找不到,导致rJava 安装后加载不了,rJava包还是没通过。
libjvm.so: cannot open shared object file: No such file or directory
进$JAVA_HOME路径中搜libjvm.so,确实是存在的,还是环境变量的问题? 继续百度和尝试,终于下面方面试通了,还有个变量要设:
export LD_LIBRARY_PATH=$JRE_HOME/lib/amd64/server:$JRE_HOME/lib/amd64/
 
好事多磨,终于看到了可爱的提示:
installing via 'install.libs.R' to /home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava
** R
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (rJava)
The downloaded source packages are in
‘/tmp/RtmpOkzZDC/downloaded_packages’
 
回顾整个过程,总结起来有两点:
1.各种问题和错误都有其原因,一定要有耐心,总能把它找出来并解决掉。
2.配置中的问题与环境相关性较大,最终发现两个问题都是环境和环境变量设置的问题。回想以前环境JAVA配置过程中好像从来没expo过这么多变量,这次可能与本地安装了多个JDK版本有关吧。
 
后记:命令行中输入可查看R环境中JAVA相关的设置,如下:
$  sudo R CMD  javareconf
Java interpreter : /usr/bin/java
java version     : 1.8.0_131
Java home path   : /usr/lib/jvm/jdk1.8.0_131/jre
Java compiler    : /usr/bin/javac
Java headers gen.: /usr/bin/javah
Java archive tool: /usr/bin/jar
trying to compile and link a JNI progam 
detected JNI cpp flags    : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/linux
detected JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -I/usr/lib/jvm/jdk1.8.0_131/jre/../include -I/usr/lib/jvm/jdk1.8.0_131/jre/../include/linux     -fpic  -O3 -pipe  -g  -c conftest.c -o conftest.o
gcc -std=gnu99 -shared -o conftest.so conftest.o -L/usr/lib/jvm/jdk1.8.0_131/jre/lib/amd64/server -ljvm -L/usr/lib/R/lib -lR
JAVA_HOME        : /usr/lib/jvm/jdk1.8.0_131/jre
Java library path: $(JAVA_HOME)/lib/amd64/server
JNI cpp flags    : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/linux
JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
Updating Java configuration in /usr/lib/R
Done.
 
本文永久更新地址:http://www.linuxdiyf.com/linux/31635.html