~$ java -version
初学R语言,尝试在Rstudio中安装xlsx包
> install.packages('xlsx')
报错,/usr/lib/jvm/default-java/jre/bin/java: No such file or directory, 具体内容如下:
checking Java support in R... present:
interpreter : '/usr/lib/jvm/default-java/jre/bin/java'
archiver : '/usr/lib/jvm/default-java/bin/jar'
compiler : '/usr/lib/jvm/default-java/bin/javac'
header prep.: '/usr/lib/jvm/default-java/bin/javah'
cpp flags : '-I/usr/lib/jvm/default-java/include'
java libs : '-L/usr/lib/jvm/default-java/jre/lib/amd64/server -ljvm'
checking whether Java run-time works... ./configure: line 3736: /usr/lib/jvm/default-java/jre/bin/java: No such file or directory
no
configure: error: Java interpreter '/usr/lib/jvm/default-java/jre/bin/java' does not work
ERROR: configuration failed for package ‘rJava’
* removing ‘/home/wuqili/R/x86_64-pc-linux-gnu-library/3.2/rJava’
Warning in install.packages :
installation of package ‘rJava’ had non-zero exit status
ERROR: dependency ‘rJava’ is not available for package ‘xlsxjars’
* removing ‘/home/wuqili/R/x86_64-pc-linux-gnu-library/3.2/xlsxjars’
Warning in install.packages :
installation of package ‘xlsxjars’ had non-zero exit status
ERROR: dependencies ‘rJava’, ‘xlsxjars’ are not available for package ‘xlsx’
* removing ‘/home/wuqili/R/x86_64-pc-linux-gnu-library/3.2/xlsx’
Warning in install.packages :
installation of package ‘xlsx’ had non-zero exit status
The downloaded source packages are in
‘/tmp/RtmpIgTO8o/downloaded_packages’
既然java not work, 所以在终端输入 java -version 查看
root:~$ java -version
程序 'java' 已包含在下列软件包中:
* default-jre
* gcj-5-jre-headless
* openjdk-8-jre-headless
* gcj-4.8-jre-headless
* gcj-4.9-jre-headless
* openjdk-9-jre-headless
请尝试:sudo apt install <选定的软件包>
根据提示,选择安装default-jre
root:~$ sudo apt install default-jre
安装成功后,再次检查java -version
root:~$ java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2ubuntu1.16.04.3-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
随后回到Rstudio, 再次安装xlsx,出现新的错误,configure: error: Cannot compile a simple JNI program.
具体错误如下:
checking whether Java run-time works... yes
checking whether -Xrs is supported... yes
checking whether JNI programs can be compiled... configure: error: Cannot compile a simple JNI program. See config.log for details.
Make sure you have Java Development Kit installed and correctly registered in R.
If in doubt, re-run "R CMD javareconf" as root.
ERROR: configuration failed for package ‘rJava’
* removing ‘/home/wuqili/R/x86_64-pc-linux-gnu-library/3.2/rJava’
Warning in install.packages :
installation of package ‘rJava’ had non-zero exit status
ERROR: dependency ‘rJava’ is not available for package ‘xlsxjars’
* removing ‘/home/wuqili/R/x86_64-pc-linux-gnu-library/3.2/xlsxjars’
Warning in install.packages :
installation of package ‘xlsxjars’ had non-zero exit status
ERROR: dependencies ‘rJava’, ‘xlsxjars’ are not available for package ‘xlsx’
* removing ‘/home/wuqili/R/x86_64-pc-linux-gnu-library/3.2/xlsx’
Warning in install.packages :
installation of package ‘xlsx’ had non-zero exit status
The downloaded source packages are in
‘/tmp/RtmpIgTO8o/downloaded_packages’
于是根据提示,在终端输入 R CMD javareconf, 显示conftest.c:1:17: fatal error: jni.h: 没有那个文件或目录
root:R CMD javareconf
Java interpreter : /usr/lib/jvm/default-java/jre/bin/java
Java version : 1.8.0_131
Java home path : /usr/lib/jvm/default-java
Java compiler : not present
Java headers gen.:
Java archive tool:
trying to compile and link a JNI program
detected JNI cpp flags :
detected JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c conftest.c -o conftest.o
conftest.c:1:17: fatal error: jni.h: 没有那个文件或目录
compilation terminated.
/usr/lib/R/etc/Makeconf:134: recipe for target 'conftest.o' failed
make: *** [conftest.o] Error 1
Unable to compile a JNI program
JAVA_HOME : /usr/lib/jvm/default-java
Java library path:
JNI cpp flags :
JNI linker flags :
Updating Java configuration in /usr/lib/R
Done.
使用locate jni.h没有任何输出,于是尝试:
root:sudo apt install openjdk-9-source
.....
正在处理用于 hicolor-icon-theme (0.15-0ubuntu1) 的触发器 ...
在处理时有错误发生:
/var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
又报错!!!
尝试修复,还是不行
root:sudo apt-get update --fix-missing
命中:1 http://cn.archive.ubuntu.com/ubuntu xenial InRelease
命中:2 http://cn.archive.ubuntu.com/ubuntu xenial-updates InRelease
命中:3 http://cn.archive.ubuntu.com/ubuntu xenial-backports InRelease
获取:4 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB]
获取:5 http://security.ubuntu.com/ubuntu xenial-security/main amd64 DEP-11 Metadata [60.4 kB]
获取:6 http://security.ubuntu.com/ubuntu xenial-security/main DEP-11 64x64 Icons [62.6 kB]
获取:7 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 DEP-11 Metadata [51.3 kB]
获取:8 http://security.ubuntu.com/ubuntu xenial-security/universe DEP-11 64x64 Icons [85.1 kB]
已下载 362 kB,耗时 16秒 (21.5 kB/s)
正在读取软件包列表... 完成
更新一下
root: sudo apt-get update
再次检查一下 sudo apt-get check
root:sudo apt-get check
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
您也许需要运行“apt-get -f install”来修正上面的错误。
下列软件包有未满足的依赖关系:
openjdk-9-source : 依赖: openjdk-9-jdk (>= 9~b114-0ubuntu1) 但是它还没有被安装
E: 不能满足依赖关系。不妨试一下 -f 选项。
尝试安装 openjdk-9-jdk
root:sudo apt-get install openjdk-9-jdk
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
建议安装:
openjdk-9-demo visualvm
下列【新】软件包将被安装:
openjdk-9-jdk
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 106 个软件包未被升级。
有 27 个软件包没有被完全安装或卸载。
需要下载 0 B/16.6 kB 的归档。
解压缩后会消耗 58.4 kB 的额外空间。
(正在读取数据库 ... 系统当前共安装有 223104 个文件和目录。)
正准备解包 .../openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb ...
正在解包 openjdk-9-jdk:amd64 (9~b114-0ubuntu1) ...
dpkg: 处理归档 /var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb (--unpack)时出错:
正试图覆盖 /usr/lib/jvm/java-9-openjdk-amd64/include/linux/jawt_md.h,它同时被包含于软件包 openjdk-9-jdk-headless:amd64 9~b114-0ubuntu1
在处理时有错误发生:
/var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
又是这个错误!!!
输入下面命令配置依赖关系
root:# sudo dpkg --configure -a
再次报错:
dpkg: 依赖关系问题使得 openjdk-9-source 的配置工作不能继续:
openjdk-9-source 依赖于 openjdk-9-jdk (>= 9~b114-0ubuntu1);然而:
未安装软件包 openjdk-9-jdk:amd64。
dpkg: 处理软件包 openjdk-9-source (--configure)时出错:
依赖关系问题 - 仍未被配置
正在设置 libatk-wrapper-java (0.33.3-6) ...
正在设置 libgnomevfs2-0:amd64 (1:2.24.4-6.1ubuntu1) ...
正在设置 x11proto-core-dev (7.0.31-1~ubuntu16.04.2) ...
正在设置 libxau-dev:amd64 (1:1.0.8-1) ...
正在设置 libbonobo2-0:amd64 (2.32.1-3) ...
正在设置 libatk-wrapper-java-jni:amd64 (0.33.3-6) ...
正在设置 libxdmcp-dev:amd64 (1:1.1.2-1.1) ...
正在设置 libice-dev:amd64 (2:1.0.9-1) ...
正在设置 openjdk-9-jre:amd64 (9~b114-0ubuntu1) ...
正在设置 libxcb1-dev:amd64 (1.11.1-1ubuntu1) ...
正在设置 x11proto-input-dev (2.3.1-1) ...
正在设置 libsm-dev:amd64 (2:1.2.2-1) ...
正在设置 libgnome-2-0:amd64 (2.32.1-5ubuntu1) ...
正在设置 libx11-dev:amd64 (2:1.6.3-1ubuntu2) ...
正在设置 libxt-dev:amd64 (1:1.1.5-0ubuntu1) ...
正在处理用于 libc-bin (2.23-0ubuntu9) 的触发器 ...
在处理时有错误发生:
openjdk-9-source
干脆去掉openjdk-9-source
root:sudo apt-get remove openjdk-9-source
接着再次检查依赖关系
root:sudo apt-get check
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
OK了!!!
再输入 R CMD javareconf, 还是提示 jni.h文件没有, 但是这时原来为空的Java headers gen 和 Java archive tool现在有目录了。
root: R CMD javareconf
Java interpreter : /usr/lib/jvm/default-java/jre/bin/java
Java version : 1.8.0_131
Java home path : /usr/lib/jvm/default-java
Java compiler : /usr/bin/javac
Java headers gen.: /usr/bin/javah
Java archive tool: /usr/bin/jar
trying to compile and link a JNI program
detected JNI cpp flags :
detected JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c conftest.c -o conftest.o
conftest.c:1:17: fatal error: jni.h: 没有那个文件或目录
compilation terminated.
/usr/lib/R/etc/Makeconf:134: recipe for target 'conftest.o' failed
make: *** [conftest.o] Error 1
Unable to compile a JNI program
JAVA_HOME : /usr/lib/jvm/default-java
Java library path:
JNI cpp flags :
JNI linker flags :
Updating Java configuration in /usr/lib/R
Done.
而此时再次输入locate jni.h时,已经有输出了
root:locate jni.h
/usr/lib/jvm/java-9-openjdk-amd64/include/jni.h
明明有文件,却显示没有,百度后,给出解决方法是使用gcc -I + 指定jni,h的目录,尝试后但是无效。
最后发现,除了安装jre以外,还需要安装jdk,于是
root:sudo apt-get install default-jdk
再输入 R CMD javareconf, OK了!!!
root@wuqili-Lenovo-Flex-2-14:/home/wuqili# sudo R CMD javareconf
Java interpreter : /usr/lib/jvm/default-java/jre/bin/java
Java version : 1.8.0_131
Java home path : /usr/lib/jvm/default-java
Java compiler : /usr/lib/jvm/default-java/bin/javac
Java headers gen.: /usr/lib/jvm/default-java/bin/javah
Java archive tool: /usr/lib/jvm/default-java/bin/jar
trying to compile and link a JNI program
detected JNI cpp flags : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
detected JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -I/usr/lib/jvm/default-java/include -I/usr/lib/jvm/default-java/include/linux -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -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/lib/jvm/default-java/jre/lib/amd64/server -ljvm -L/usr/lib/R/lib -lR
JAVA_HOME : /usr/lib/jvm/default-java
Java library path: $(JAVA_HOME)/jre/lib/amd64/server
JNI cpp flags : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
Updating Java configuration in /usr/lib/R
Done.
最后回到Rstudio, 依次顺利安装rjava和xlsx包。
在最初遇到问题时,本能的上网搜求解决方法,发现网上的解答都只涉及到部分问题,没有完整的解决方案。以上是参考了很多网上方案的综合版。由于是编程小白,虽然安装成功了,但是也不知道具体的所以然。但是还是把整个过程总结下来,希望可以帮助遇到类似问题的朋友!