2017-03-18 2 views
0

Je travaille sur un serveur Linux RHEL6 et j'ai installé anaconda. J'ai la configuration suivanteInstaller rJava sur RHEL6: même avec un chemin Java identique j'obtiens: erreur: Un ou plusieurs types JNI diffèrent du type natif correspondant

conda-env version : 4.3.13 
conda-build version : 2.1.4 
python version : 2.7.13.final.0 
rpy2 : 2.8.5 

J'ai installé rpy2 pour utiliser R en python. Mais avec la version de R installée avec conda j'ai un problème à installer "rJava".

checking whether Java run-time works... yes 
checking whether -Xrs is supported... yes 
checking whether JNI programs can be compiled... yes 
checking JNI data types... configure: error: One or more JNI types differ from the corresponding native type. You may need to use non-standard compiler flags or a different compiler in order to fix this. 
ERROR: configuration failed for package 'rJava' 

Avec ma version autonome de R installé sur la même machine que je n'ai pas question, donc je sais que j'ai la bonne version installée.

Pour ma 2 configuration différente avec la même version R (R autonome avec R avec Conda), j'ai la même version Java

java -version 
openjdk version "1.8.0_121" 
OpenJDK Runtime Environment (build 1.8.0_121-b13) 
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode) 

Pour les deux configuration, les variables suivantes ne sort pas

R_JAVA_LD_LIBRARY_PATH 
JAVA_HOME 

défini. Le chemin d'accès sont très similaires pour autonome:

PATH=/opt/ccda/anaconda2/bin:/opt/opennlp/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 

tandis que R installé avec Conda je:

PATH=/opt/ccda/anaconda2/envs/py27CCA/bin:/opt/ccda/anaconda2/bin:/opt/ccda/anaconda2/bin:/opt/opennlp/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 

Voici les informations lors de la compilation. Pour la version R autonome:

interpreter : '/usr/bin/java' 
archiver : '/usr/bin/jar' 
compiler : '/usr/bin/javac' 
header prep.: '/usr/bin/javah' 
cpp flags : '-I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include/linux' 
java libs : '-L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/lib/amd64/server -ljvm 

Alors que pour la version R installé avec Conda:

interpreter : '/usr/lib/jvm/java/jre/bin/java' 
archiver : '/usr/lib/jvm/java/jre/../bin/jar' 
compiler : '/usr/lib/jvm/java/jre/../bin/javac' 
header prep.: '/usr/lib/jvm/java/jre/../bin/javah' 
cpp flags : '-I/usr/lib/jvm/java/include -I/usr/lib/jvm/java/include/linux' 
java libs : '-L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/lib/amd64/server -ljvm' 

J'ai essayé d'obtenir le même chemin en utilisant:

export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java 
export R_JAVA_LD_LIBRARY_PATH=${JAVA_HOME}/lib/amd64/server 
export JAVA_CPPFLAGS="-I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include/linux" 

par la voie:

/usr/bin/java -> /etc/alternatives/java 
/etc/alternatives/java -> /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java 

mais après reru nning:

R CMD javareconf 

et recompiler je reçois la même erreur alors que le chemin semble la même chose maintenant:

interpreter : '/usr/bin/java' 
archiver : '/usr/bin/jar' 
compiler : '/usr/bin/javac' 
header prep.: '/usr/bin/javah' 
cpp flags : '-I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include/linux' 
java libs : '-L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/lib/amd64/server -ljvm' 

donc je ne comprends pas ce que cela signifie « un ou plusieurs types JNI diffèrent » et que Je devrais dans la voie et le drapeau pour le faire fonctionner.

R CMD javareconf 
Java interpreter : /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java 
Java version  : 1.8.0_121 
Java home path : /usr/lib/jvm/jre-1.8.0-openjdk.x86_64 
Java compiler : /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/../bin/javac 
Java headers gen.: /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/../bin/javah 
Java archive tool: /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/../bin/jar 

trying to compile and link a JNI program 
detected JNI cpp flags : -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include/linux 
detected JNI linker flags : -L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/lib/amd64/server -ljvm 
gcc -std=gnu99 -I/opt/ccda/anaconda2/envs/py27CCA/lib/R/include -DNDEBUG -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include/linux -I/opt/ccda/anaconda2/envs/py27CCA/include -fpic -I/opt/ccda/anaconda2/envs/py27CCA/include -c conftest.c -o conftest.o 
gcc -std=gnu99 -shared -L/opt/ccda/anaconda2/envs/py27CCA/lib/R/lib -L/opt/ccda/anaconda2/envs/py27CCA/lib -lgfortran -o conftest.so conftest.o -L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/lib/amd64/server -ljvm -L/opt/ccda/anaconda2/envs/py27CCA/lib/R/lib -lR 


JAVA_HOME  : /usr/lib/jvm/jre-1.8.0-openjdk.x86_64 
Java library path: /usr/lib/jvm/java/jre/lib/amd64/server 
JNI cpp flags : -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/../include/linux 
JNI linker flags : -L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre/lib/amd64/server -ljvm 
Updating Java configuration in /opt/ccda/anaconda2/envs/py27CCA/lib/R 
Done. 

Je suis hors de l'idée car je ne comprends pas vraiment la signification des messages d'erreur. J'ai essayé toutes les suggestions des différents threads liés à des problèmes similaires.

Edit: en utilisant l'exportation

LD_LIBRARY_PATH=$JAVA_HOME/lib/amd64:$JAVA_HOME/lib/amd64/server 

résoudre une partie du problème (dans ce cas JAVA_HOME n'est plus nécessaire), mais je il y a trop autre question:

  • -m64 drapeaux n'est pas utilisé dans ce cas (alors qu'il est utilisé avec la version autonome R)

  • /usr/bin/ld: ne peut pas trouver -liconv

mais la bibliothèque existe:

/opt/ccda/anaconda2/envs/py27CCA/lib/libiconv.so 
/opt/ccda/anaconda2/envs/py27CCA/lib/libiconv.so.2 
/opt/ccda/anaconda2/envs/py27CCA/lib/libiconv.so.2.5.1 
/opt/ccda/anaconda2/envs/py27CCA/lib/preloadable_libiconv.so 

mais peut-être pas dans le chemin utilisé, alors je dois résoudre ce problème maintenant.

Répondre

1

Assurez-vous de reconfigurer votre environnement R avec des paramètres explicites pointant vers JDK.

Assurez-vous que les points JAVA_HOME à JDK

export JAVA_HOME=your_JDK_installation 

Ensuite, reconfigure R et passer tous les endroits explicitement

sudo R CMD javareconf \ 
JAVA_HOME=${JAVA_HOME} \ 
JAVA=${JAVA_HOME/bin/java \ 
JAVAC=${JAVA_HOME}/bin/javac \ 
JAVAH=${JAVA_HOME}/bin/javah \ 
JAR=${JAVA_HOME}/bin/jar \ 
JAVA_LD_LIBRARY_PATH=${JAVA_HOME}/jre/lib/server \ 
JAVA_CPPFLAGS="-I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux" 

Ensuite, essayez de configurer Rjava en dehors R

curl https://cran.r-project.org/src/contrib/rJava_0.9-8.tar.gz -o rJava_0.9-8.tar.gz 
tar zxf rJava_0.9-8.tar.gz 
cd rJava 
./configure 

Si cela fonctionne, vous devriez pouvoir l'installer depuis les sources à l'intérieur de R

install.packages("rJava", type="source")