web-dev-qa-db-fra.com

R, erreur de chargement rJava

J'exécute R (version 3.4.0) sur macOS sierra (10.12.5) et j'essaie d'utiliser la bibliothèque xlsx qui nécessite l'utilisation de la bibliothèque rJava.

Lorsque j'essaie de charger rJava à l'aide de library(rJava) dans la console R (il n'y a pas de différence entre RStudio et le terminal), le message d'erreur suivant s'affiche et j'ai du mal à comprendre:

Fehler: package or namespace load failed for ‘rJava’:
 .onLoad in loadNamespace() für 'rJava' fehlgeschlagen, Details:
  Aufruf: dyn.load(file, DLLpath = DLLpath, ...)
  Fehler: kann shared object '/Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/libs/rJava.so' nicht laden:
  dlopen(/Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: @rpath/libjvm.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/libs/rJava.so
  Reason: image not found

En cherchant le problème sur Google, j'ai trouvé un certain nombre de messages sur des problèmes quelque peu similaires (mais à chaque fois légèrement différents), cette SO question étant la plus prometteuse d'entre elles. 

Comme les étapes proposées nécessitent une adaptation à mon cas et que je suis un peu novice, je n’ai pas pu les mettre en œuvre. Que puis-je faire?

Information additionnelle:

La commande Shell Java -version renvoie:

Java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

Et la commande Shell R CMD javareconf renvoie:

Java interpreter : /usr/bin/Java
Java version     : 1.8.0_131
Java home path   : /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre
Java compiler    : /usr/bin/javac
Java headers gen.: /usr/bin/javah
Java archive tool: /usr/bin/jar
Non-system Java on macOS

trying to compile and link a JNI program 
detected JNI cpp flags    : -I$(Java_HOME)/../include -I$(Java_HOME)/../include/darwin
detected JNI linker flags : -L$(Java_HOME)/lib/server -ljvm
clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/../include/darwin  -I/usr/local/include   -fPIC  -Wall -g -O2  -c conftest.c -o conftest.o
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -    L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o conftest.so conftest.o -L/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/server -ljvm -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation


Java_HOME      /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre
Java library path: $(Java_HOME)/lib/server
JNI cpp flags    : -I$(Java_HOME)/../include -I$(Java_HOME)/../include/darwin
JNI linker flags : -L$(Java_HOME)/lib/server -ljvm
Updating Java configuration in /Library/Frameworks/R.framework/Resources
Done.

Toute aide est la bienvenue!

7
MrMax

Ça marche!

Après avoir installé et réinstallé différentes versions de Java et rJava avec la commande R install.packages("rJava"), je suis arrivé au point où le chargement de la bibliothèque dans la console R (fenêtre Shell) ne générait plus de message d'erreur.

Après cela, j'ai pu utiliser la réponse dans this post pour que cela fonctionne dans RStudio en exécutant cette commande Shell:

Sudo ln -f -s $(/usr/libexec/Java_home)/jre/lib/server/libjvm.dylib /usr/local/lib

Pas trop compliqué après tout! Merci pour la patience de tous. 

16
MrMax

Le chemin Java_HOME est différent pour différentes versions de MAC OS. Dans certains cas, il existe un dossier /jre et dans certains cas, pas après le /Home directeur, allez manuellement vers le dossier /server avec la commande CD dans le terminal et, en utilisant pwd, copiez le chemin complet pour définir Java.home, puis chargez facilement la bibliothèque rJava. Voici comment j'ai pu résoudre le problème

options("Java.home"="/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/lib")

Sys.setenv(LD_LIBRARY_PATH='$Java_HOME/server')

dyn.load('/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/lib/server/libjvm.dylib')

library(rJava)
1
vinay karagod