J'essaie d'installer rJava dans un conteneur Docker basé sur Debian (Jessie) avec Anaconda.
En tant que root, je l'ai fait
$ apt-get update && apt-get install -y --no-install-recommends \
default-jdk default-jre libicu-dev
Alors
$ 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.
Mais jni.h a raison dans le JDK:
# find /usr/lib/jvm/jdk1.8.0_121/ -name jni.h
/usr/lib/jvm/jdk1.8.0_121/include/jni.h
Il ne semble pas que javareconf
le trouve. Et, si je regarde toutes les variables que je pourrais définir avec javareconf, comme Java_HOME, je ne vois pas la possibilité de définir des drapeaux JNI cpp, qui auraient besoin des bons inclus.
J'ai vu diversmessages sur Internet de ce problème, mais aucune solution.
R regarde un endroit différent:
detected JNI cpp flags : -I/usr/lib/jvm/Java/include -I/usr/lib/jvm/Java/include/linux
J'ai rencontré un problème similaire, mais tout va bien après l'installation de jdk:
Sudo apt-get install openjdk-8-jdk
Eu le même problème. Résolu en spécifiant le chemin d'accès au dossier Java. Brièvement, après avoir installé Java, vous pouvez obtenir une ligne comme celle-ci.
update-alternatives: using /usr/lib/jvm/Java-9-openjdk-AMD64/bin/jar to provide /usr/bin/jar (jar) in auto mode
J'ai spécifié ce chemin comme argument Java_HOME lors de l'appel de javareconf, comme suit.
Sudo R CMD javareconf Java_HOME=/usr/lib/jvm/Java-9-openjdk-AMD64/bin/jar
J'espère que c'est utile
J'ai résolu le problème en éditant le fichier 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}
J'avais déjà Java 11 sur Ubuntu 18.04 mais j'ai dû installer jdk-11.0.1 en suivant ce guide: https://websiteforstudents.com/how-to-install-Oracle- Java-jdk-11-on-ubuntu-18-04-16-04-18-10 /
J'ai ensuite changé Java_HOME dans javaconf, tout comme @Spanska Forteva
Sudo nano /usr/lib/R/etc/javaconfIn javaconf
J'ai trouvé que le chemin vers une ancienne version de Java était toujours spécifié.
## 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~}
J'ai changé le chemin vers Java_HOME vers mon jdk nouvellement installé:
: ${Java_HOME=/usr/lib/jvm/jdk-11.0.1}
Puis a exécuté le CMD avec le chemin d'accès à jni.h spécifié:
Sudo R CMD javareconf /usr/lib/jvm/jdk-11.0.1/include/jni.h
Le dernier bit n'est peut-être pas nécessaire, il devrait de toute façon pouvoir regarder dans ce dossier, mais c'est ce que j'ai fait.
Je ne sais pas si une réponse a été confirmée ici, mais je voudrais signaler à tout le monde article par Andrew Collier.
Ce qu'il recommande:
(1) Mise à jour de tous les référentiels
Sudo apt update -y
(2) S'assurer que JRE et JDK 8 sont installés
Sudo apt install -y openjdk-8-jdk openjdk-8-jre
(3) Ensuite, comme de nombreux utilisateurs l'ont déjà dit, pointant R vers Java avec un chemin explicite vers JDK 8
Sudo R CMD javareconf Java_HOME=/usr/lib/jvm/Java-8-openjdk-AMD64/
Le package spécifique Java n'a pas trop d'importance tant qu'il a tout le contenu compilé nécessaire dans le répertoire/include.
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
Pour en savoir plus, je recommanderais comment faire pour que jni.h soit trouvé? = pour avoir localisé/compilé correctement ce répertoire.
A eu le même problème et a finalement pu le résoudre. Après beaucoup de recherches, cela a fonctionné pour moi (j'ai essentiellement suivi le guide ici: https://www3.ntu.edu.sg/home/ehchua/programming/howto/JDK_Howto.html ):
Pour cela, j'ai couru:
$ 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
suivi par
$ 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
Ensuite, je pouvais enfin voir mon Java dans les alternatives de
Sudo update-alternatives --config Java
où j'ai sélectionné le Java nouvellement installé. Puis j'ai couru
Sudo R CMD javareconf Java_HOME=/usr/Java/jdk1.8.0_201/bin/
dans lequel j'ai spécifié à nouveau mon chemin Java jdk explicitement. Après cela, j'ai réussi à installer rJava dans Rstudio dont j'avais besoin pour installer glmulti.
Dans mon cas, j'ai dû courir
R CMD javareconf
comme su
, juste Sudo
ne fonctionnait pas.