R 之 rJava 包安裝錯誤的解決方案


前幾天在Ubuntu上安裝R中的xlsx包時一直卡在了rJava包的安裝上,最終各種google都沒能解決問題.直到最后,我回到了安裝rJava時的錯誤記錄....我用血的教訓證明,錯誤日志是很重要很重要的!!!!!

(由於已經成功地排除了錯誤,且不打算折騰我的電腦,我就從網上copy一個類似的來說明下發生了什么問題)

運行 install.packages("rJava")並下載解壓縮后,日志顯示電腦上JDK環境配置有問題.(一大堆的yes后在"checking Java support in R"那里卡住了)

如下:

checking Java support in R... present:
interpreter : '/usr/bin/java'
archiver    : ''                       #空白
compiler    : '/usr/bin/javac'
header prep.: ''                      #空白
cpp flags   : '-I/usr/share/jdk1.8.0_51/jre/../include -I/usr/share/jdk1.8.0_51/jre/../include/linux'
java libs   : '-L/usr/share/jdk1.8.0_51/jre/lib/amd64/server -ljvm'
configure: error: One or more Java configuration variables are not set.
Make sure R is configured with full Java support (including JDK). Run         #注意此句:JDK環境有誤
R CMD javareconf
as root to add Java support to R.                   # 這句告訴我們,在確保JDK的安裝路徑沒有問題的情況下應該如何就行修復

If you don't have root privileges, run
R CMD javareconf -e
to set all Java-related variables and then install rJava.

ERROR: configuration failed for package ‘rJava’                          #由於安裝出錯,移除安裝包
* removing ‘/home/cc886/R/x86_64-pc-linux-gnu-library/3.1/rJava’
Warning in install.packages :
  installation of package ‘rJava’ had non-zero exit status

The downloaded source packages are in
	‘/tmp/RtmpaX9v6v/downloaded_packages’

事實上我在翻看錯誤記錄看到那兩段空白的時候,終於意識到了問題的關鍵. 一開始在Ubuntu上配置的是用apt-get獲取的openjdk環境,無論我如何運行R CMD javareconf 都沒能修復這個問題.

最后,在嘗試着上官網下載sunjdk並進行配置的過程中,我發現openjdk和sunjdk相比少了一些文件,即bin文件夾里的javac,javah等等.而Javac立刻讓我聯想到了錯誤日志里的"compliler"的空白.於是我用sudo update-alternatives --install ***** 對jar,javah等進行了手動的指定.並發現那兩段空白被填補上了.也就是說,這個安裝錯誤信息出現的根本原因就是缺少了jar,javah等的指定(前提是有這些文件)

如果不對jar,javah進行手動指定,運行sudo R CMD javareconf過程中Java headers gen和Java archive tool項會缺失,如下

cc886@cc886:~$ sudo R CMD javareconf -e
[sudo] password for cc886: 
Java interpreter : /usr/bin/java
Java version     : 1.8.0_51
Java home path   : /usr/share/jdk1.8.0_51/jre
Java compiler    : /usr/bin/javac
Java headers gen.:                 #缺失
Java archive tool:                  #缺失

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/share/jdk1.8.0_51/jre/../include -I/usr/share/jdk1.8.0_51/jre/../include/linux     -fpic  -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c conftest.c -o conftest.o
gcc -std=gnu99 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o conftest.so conftest.o -L/usr/share/jdk1.8.0_51/jre/lib/amd64/server -ljvm -L/usr/lib/R/lib -lR

The following Java variables have been exported:
JAVA_HOME JAVA JAVAC JAVAH JAR JAVA_LIBS JAVA_CPPFLAGS JAVA_LD_LIBRARY_PATH
Running: /bin/bash

因此,我們需要在手動指定了jar,javah后再運行

sudo R CMD javareconf

在JDK路徑無誤的狀態下,此命令會自動地進行DEBUG.並export一個環境變量 JAVA_TOOL_OPTIONS. 當所有空白被正確填補,並成功運行上述命令后,rJava包即可成功安裝.


另,此時運行 java -version會是如下狀況,其中的 JAVA_TOOL_OPTIONS一行是rJava的安裝所致.

user@loca:~$ java -version
Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar 
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

具體DEBUG步驟

配置JDK環境

詳見另一篇博文:Ubuntu 中 java 環境 (sunjdk) 的配置 (附詳細說明)

手動指定archiver, header prep.

# 以下兩條應該已經在配置JDK的時候已經運行過了
$ sudo update-alternatives --install /usr/bin/java java /usr/share/jdk1.8.0_51/bin/java 300
$ sudo update-alternatives --install /usr/bin/javac javac /usr/share/jdk1.8.0_51/bin/javac 300

#下面這些是DEBUG所需的
$ sudo update-alternatives --install /usr/bin/jar jar /usr/share/jdk1.8.0_51/bin/jar 300
$ sudo update-alternatives --install /usr/bin/javah javah /usr/share/jdk1.8.0_51/bin/javah 300

指定archiver (jar), header prep (javah)

# config選項指定
$ sudo update-alternatives --config jar 
$ sudo update-alternatives --config javah

運行sudo R CMD javareconfsudo R CMD javareconf -e

按照R中提示運行命令(不知道具體是那個起的作用)

$ sudo R CMD javareconf
$ sudo R CMD javareconf -e

安裝rJava包

在R中運行

install.packages("rJava")

一路直踩到底,大功告成!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM