我正在尝试在基于debian(jessie)和Anaconda的docker容器中安装rJava。
作为root,我做了
$ apt-get update && apt-get install -y --no-install-recommends \
default-jdk default-jre libicu-dev
然后
$ R CMD javareconf
Java interpreter : /usr/lib/jvm/jdk1.8.0_121/jre/bin/java
Java version : 1.8.0_121
Java home path : /usr/lib/jvm/jdk1.8.0_121
Java compiler : /usr/lib/jvm/jdk1.8.0_121/bin/javac
Java headers gen.: /usr/lib/jvm/jdk1.8.0_121/bin/javah
Java archive tool: /usr/lib/jvm/jdk1.8.0_121/bin/jar
trying to compile and link a JNI program
detected JNI cpp flags : -I/usr/lib/jvm/java/include -I/usr/lib/jvm/java/include/linux
detected JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
gcc -std=gnu99 -I/opt/conda/lib/R/include -DNDEBUG -I/usr/lib/jvm/java/include -I/usr/lib/jvm/java/include/linux -I/opt/conda/include -fpic -I/opt/conda/include -c conftest.c -o conftest.o
conftest.c:1:17: fatal error: jni.h: No such file or directory
#include <jni.h>
^
compilation terminated.
/opt/conda/lib/R/etc/Makeconf:133: recipe for target 'conftest.o' failed
make: *** [conftest.o] Error 1
Unable to compile a JNI program
JAVA_HOME : /usr/lib/jvm/jdk1.8.0_121
Java library path:
JNI cpp flags :
JNI linker flags :
Updating Java configuration in /opt/conda/lib/R
Done.
但jni.h在JDK中是正确的:
# find /usr/lib/jvm/jdk1.8.0_121/ -name jni.h
/usr/lib/jvm/jdk1.8.0_121/include/jni.h
看起来javareconf
看起来并不像。而且,如果我查看我可以使用javareconf设置的所有变量,比如JAVA_HOME,我看不到能够设置JNI cpp标志,这需要正确的包含。
答案 0 :(得分:13)
R正在寻找不同的位置:
detected JNI cpp flags : -I/usr/lib/jvm/java/include -I/usr/lib/jvm/java/include/linux
我遇到了类似的问题,但安装jdk后一切都很好:
sudo apt-get install openjdk-8-jdk
答案 1 :(得分:6)
有同样的问题。通过指定Java文件夹的路径来修复。简而言之,在安装Java之后,您可能会得到这样的一行。
update-alternatives: using /usr/lib/jvm/java-9-openjdk-amd64/bin/jar to provide /usr/bin/jar (jar) in auto mode
我在调用javareconf时将该路径指定为JAVA_HOME参数,如下所示。
sudo R CMD javareconf JAVA_HOME=/usr/lib/jvm/java-9-openjdk-amd64/bin/jar
希望这很有用
答案 2 :(得分:4)
我通过编辑java-config文件解决了这个问题
sudo nano /usr/lib/R/etc/javaconf
set the correct JAVA_HOME in this row:
: ${JAVA_HOME=/usr/local/java/jdk-9.0.1}
答案 3 :(得分:3)
我不确定此处是否已确认答案,但我会向所有人指出安德鲁·科利尔(Andrew Collier)的article。
他的建议:
(1)更新所有存储库
sudo apt update -y
(2)确保已安装JRE和JDK 8
sudo apt install -y openjdk-8-jdk openjdk-8-jre
(3)然后,正如许多用户已经说过的那样,将R指向具有JDK 8显式路径的java
sudo R CMD javareconf JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
只要在/ include目录中具有所有必需的已编译内容,特定的Java包就没有太大关系。
user@laptop:~$ ls /usr/lib/jvm/java-8-openjdk-amd64/include/
classfile_constants.h jdwpTransport.h jvmticmlr.h linux
jawt.h jni.h jvmti.h
有关此内容的更多信息,我建议使用 how to make jni.h be found? 来正确定位/编译此目录。
答案 4 :(得分:1)
我已经在ubuntu 18.04上安装了Java 11,但是必须按照以下指南安装jdk-11.0.1:https://websiteforstudents.com/how-to-install-oracle-java-jdk-11-on-ubuntu-18-04-16-04-18-10/
然后我像@Spanska Forteva一样在javaconf中更改了JAVA_HOME
sudo nano /usr/lib/R/etc/javaconfIn javaconf
我发现仍然指定了旧版Java的路径。
## Versions from settings when configure was run
: ${JAVA_HOME=/usr/lib/jvm/default-java}
: ${JAVA_CPPFLAGS=~autodetect~}
: ${JAVA_LD_LIBRARY_PATH=~autodetect~}
: ${JAVA_LIBS=~autodetect~}
我将JAVA_HOME的路径更改为新安装的jdk:
: ${JAVA_HOME=/usr/lib/jvm/jdk-11.0.1}
然后使用指定的jni.h路径运行CMD:
sudo R CMD javareconf /usr/lib/jvm/jdk-11.0.1/include/jni.h
可能不需要最后一点,无论如何它应该能够在该文件夹中查找,但这就是我所做的。
答案 5 :(得分:1)
遇到同样的问题,最终可以解决。经过大量搜索,这对我有用(我基本上遵循此处的指南:https://www3.ntu.edu.sg/home/ehchua/programming/howto/JDK_Howto.html):
为此,我跑了
$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/java/jdk1.8.0_201/bin/java" 1
$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/java/jdk1.8.0_201/bin/javac" 1
$ sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/java/jdk1.8.0_201/bin/javaws" 1
之后
$ sudo update-alternatives --set java /usr/java/jdk1.8.0_201/bin/java
$ sudo update-alternatives --set javac /usr/java/jdk1.8.0_201/bin/javac
$ sudo update-alternatives --set javaws /usr/java/jdk1.8.0_201/bin/javaws
然后,我终于可以在以下选项中看到我的Java了
sudo update-alternatives --config java
我在其中选择了新安装的java。然后我跑了
sudo R CMD javareconf JAVA_HOME=/usr/java/jdk1.8.0_201/bin/
在其中我再次明确指定了我的java jdk路径。成功完成此操作后,我能够在Rstudio中安装rJava,而我需要安装glmulti。
答案 6 :(得分:1)
就我而言,我必须跑步
R CMD javareconf
与su
一样,仅sudo
无效。