rJava的安装

26

我曾尝试通过SO上以前的问题/答案来解决这个问题,但没有成功。所以,这是我的问题。

我在Ubuntu盒子(14.04)上使用RStudio,尝试从源代码升级rJava,在此过程中,我设法将其丢失。

我尝试使用以下命令重新安装:

install.packages("rJava")

出现了以下错误消息:

configure: error: One or more Java configuration variables are not set.
Make sure R is configured with full Java support (including JDK). Run
R CMD javareconf
as root to add Java support to R.

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/darren/R/x86_64-pc-linux-gnu-library/3.2/rJava’
Warning in install.packages :
  installation of package ‘rJava’ had non-zero exit status

所以,我打开终端并键入以下命令,
sudo R CMD javareconf

同时也出现了以下错误:

trying to compile and link a JNI program 
detected JNI cpp flags    : 
detected JNI linker flags : -L/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG      -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c conftest.c -o conftest.o
conftest.c:1:17: fatal error: jni.h: No such file or directory
 #include <jni.h>
                 ^
compilation terminated.
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.

我尝试着按照这些链接:一个两个 的方法来解决问题,但好像没有解决我的问题。在SO上还有更多的链接,但我不确定该跟随哪个。我已经通过Ubuntu软件中心卸载和重新安装过RStudio,但是这并没有起到任何作用。
请问有人能帮忙吗?
简而言之,我想再次使用rJava与RStudio,而不会影响Java的其他用途(如jmol)。

1
你不应该使用[R]或[rjava]标签进行搜索,而是应该搜索如何在你的机器上安装Java。 - IRTFM
@bluefish 是的,“r-cran-rjava”已经是最新版本了。 - DarrenRhodes
2
是的,正如@42-所说,您甚至没有安装JDK - 这是要做的第一件事。 - Simon Urbanek
1
@42- 但是当我输入java -version时,我得到以下结果。 java版本“1.7.0_91” OpenJDK运行时环境(IcedTea 2.6.3)(7u91-2.6.3-0ubuntu0.14.04.1) OpenJDK 64位服务器VM(构建24.91-b01,混合模式) - DarrenRhodes
@42- 我从这个链接 http://askubuntu.com/questions/56104/how-can-i-install-sun-oracles-proprietary-java-jdk-6-7-8-or-jre (第一个jdk答案) 安装了jdk,并在RStudio控制台中运行了以下命令:system("java versions"),但是出现了以下错误信息:Error: Could not find or load main class versions. - DarrenRhodes
显示剩余6条评论
6个回答

36

您似乎没有安装JDK。您至少需要安装

sudo apt-get install openjdk-7-jdk

然后重新运行

sudo R CMD javareconf

确保您不要手动设置JAVA_HOME - 它将自动检测。 然后,您应该看到类似于以下内容:

$ sudo R CMD javareconf
Java interpreter : /usr/bin/java
Java version     : 1.7.0_91
Java home path   : /usr/lib/jvm/java-7-openjdk-amd64/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 program 
detected JNI cpp flags    : -I$(JAVA_HOME)/../include
detected JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -I/usr/lib/jvm/java-7-openjdk-amd64/jre/../include     -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -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/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server -ljvm -L/usr/lib/R/lib -lR


JAVA_HOME        : /usr/lib/jvm/java-7-openjdk-amd64/jre
Java library path: $(JAVA_HOME)/lib/amd64/server
JNI cpp flags    : -I$(JAVA_HOME)/../include
JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm

这个答案有效,并且没有干扰我的其他基于Java的产品jmol。您能否编辑一下并解释一下为什么这个有效而其他方法不行? - DarrenRhodes
1
这个解决方案的原因是它会在您已经拥有的OpenJDK和Oracle JDK之外安装一个新的JDK。该命令还会将默认的java更改为此OpenJDK7,它与您的jmol版本兼容。其他现有的JDK是Java 8,不兼容jmol。 - biocyberman
2
在Debian stretch中,我需要通过sudo apt-get install default-jdk更改jdk的安装方式,只有这样才能使其正常工作。 - Adriano Rivolli

14

sudo apt-get install r-cran-rjava 有什么问题吗?

可以参考早期的答案和相关帖子/线程

如果要从头开始安装,你可以使用sudo apt-get build-dep r-cran-rjava,它会为你获取与Ubuntu版本相对应的JDK。


问题是“从源代码升级rJava”,而不是“我想要一个可用的rJava” ;) - Simon Urbanek
我明白了。已做出相应修改 :) - Dirk Eddelbuettel
sudo apt-get install r-cran-rjava[sudo] 正在读取软件包列表... 完成 正在建立依赖关系树
正在读取状态信息... 完成 r-cran-rjava 已经是最新版本。 升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 7 个软件包未被升级。
- DarrenRhodes
1
这对我有用。我们需要告诉R项目的人,这肯定不是标准行为。 - user3083324

6

首先我建议从其网站安装Rstudio:https://www.rstudio.com/products/rstudio/download/(即Rstudio 64位:https://download1.rstudio.org/rstudio-0.99.489-amd64.deb)。这并不能直接解决问题,但可以避免其他与Rstudio相关的错误。

关于错误,需要确保已安装JDK。我认为命令java -version无法告诉您是否已安装JDK。您必须检查JDK本身的包或根据错误消息执行以下操作:

locate jni.h 输出应与您的JAVAHOME匹配或兼容,例如:

/usr/lib/jvm/java-7-openjdk-amd64/include/jni.h 
/usr/lib/jvm/java-7-oracle/include/jni.h        
更新1:R CMD javareconf正在查找jni.h文件,该文件位于$(JAVA_HOME)/include下。您已经安装了JDK,但很可能将默认的Java指向了JRE目录,这就是错误发生的原因。

您可以通过执行以下命令来查看default-java实际指向的位置:

jRealDir=$(readlink -f /usr/lib/jvm/default-java)
echo $jRealDir
# sample correct output: /usr/lib/jvm/jdk1.8.0_65 
# or /usr/lib/jvm/java-8-oracle if you default to Oracle's
# now check jni.h
ls -l $jRealDir/include/jni.h
# sample expected output:
# /usr/lib/jvm/jdk1.8.0_65/include/jni.h

如果ls命令失败,您需要进行设置,以便javareconf(以及稍后的rJava)可以使用JDK而不是JRE中的java。您有两个选项: 方法1:在整个系统范围内进行设置 这很方便,但可能会影响其他程序,例如您提到的jmol。但不用担心,这是可逆的,只需重新运行命令并选择旧的即可。执行以下命令并选择具有JDK的目录:
sudo update-alternatives --config java

测试完jmol的使用后,如果一切正常,恭喜你,现在可以开始测试rJava了。如果不行,请尝试下面的第二种方法。

方法2:仅为R进行操作

将以下内容放入您主目录下的.Rprofile文件中。

Sys.setenv(JAVA_HOME = '/usr/lib/jvm/jdk1.8.0_65')
# this set JAVA_HOME for R to correct java home dir. 

更新或创建 .Rprofile 后,在 Rstudio 中重启 R。在这种情况下,R CMD javareconf 可能仍然失败,但如果你从 Rstudio 的 Tools 菜单下的 Shell 中运行它,应该就可以了。

关于从 Ubuntu 的官方仓库安装或 Rstudio,这对于运行 rJava 没有影响。尽管如此,我建议因为新版本还有一些不错的功能(比如更好的自动补全,我最喜欢的)而安装 Rstudio 官网上的版本。


那么你对以下内容有什么看法?java -version java version "1.8.0_66" Java(TM) SE Runtime Environment (build 1.8.0_66-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)和查找jni.h /usr/lib/jvm/java-6-openjdk-amd64/include/jni.h /usr/lib/jvm/java-8-oracle/include/jni.h /usr/lib/jvm/jdk1.8.0_65/include/jni.h,而且我是通过软件中心重新安装RStudio的,这样做有什么区别吗? - DarrenRhodes
jRealDir=$(readlink -f /usr/lib/jvm/default-java) echo $jRealDir /usr/lib/jvm/java-7-openjdk-amd64 然后 ls -l $jRealDir/include/jni.h 给出 ls: 无法访问 /usr/lib/jvm/java-7-openjdk-amd64/include/jni.h: 没有那个文件或目录。但我尝试了方法2,但找不到 .Rprofile。我尝试了 ls ~/.R*,它给出了 /home/darren/.RData /home/darren/.Rhistory。谢谢迄今为止...接下来怎么办? - DarrenRhodes
只需自己从头开始创建文件。 - biocyberman
@user1945827 是的,像你说的那样编辑文件。但是,JAVA_HOME必须设置为具有jni.h的目录,例如:/usr/lib/jvm/jdk1.8.0_65。这个usr/lib/jvm/java-7-openjdk-amd64没有jni.h,所以你不能使用它。 - biocyberman
这是你在我的回答中第一条评论中发布的“locate”命令的输出。 - biocyberman
显示剩余3条评论

3

1
这是唯一在我的Debian Docker容器上有效的解决方案。说真的,Java太难了。 - Waldir Leoncio

0

你可以看到错误信息中的 JAVA_HOME 所在位置。

然后使用 locate jni.h 查找 jni.h 的位置,接下来使用软链接将该位置链接到 $(JAVA_HOME)/include,就像 @biocyberman 提到的那样。

这是我所做的:

ln -s /usr/lib/jvm/java-8-openjdk-amd64/include/jni.h /opt/conda/include/jni.h
ln -s /usr/lib/jvm/java-8-openjdk-amd64/include/linux/jni_md.h /opt/conda/include/jni_md.h
ln -s /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so /usr/lib/

由于我的JAVA_HOME/opt/conda,而且我也没有jni_md.h-ljvm

我使用的是Ubuntu 16.04


0

我一直在处理这个确切的问题,无论是这个线程还是其他类似的线程都没有解决它。我使用的是Ubuntu 16.04,以下是我让它工作的方法:

apt-get install openjdk-9-jdk rm -rf /usr/lib/jvm/default-java ln -s /usr/lib/jvm/java-9-openjdk-amd64/ /usr/lib/jvm/default-java


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接