5

I'm trying to set up R and Tomcat on RHEL6 (6.4)

I have installed R and can run it. I have installed Tomcat 7 and can host files file. I have packaged an application as a WAR file and deployed it using tomcat. The application runs fine in all aspects until it uses any R component.

This is where it crashes out with the following error as seen in catalina.out:

Cannot find JRI native library!
Please make sure that the JRI native library is in a directory listed in java.li
brary.path.

java.lang.UnsatisfiedLinkError: /usr/local/lib64/R-2.15.3/library/rJava/jri/libj
ri.so: libR.so: cannot open shared object file: Too many levels of symbolic link
s
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1750)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1675)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1047)
at org.rosuda.JRI.Rengine.<clinit>(Rengine.java:19)

I do have rJava installed under R: install.packages("rJava") It installed fine and I have rJava inside the R's library folder.

I have defined the following in /etc/profile:

export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre
export R_HOME=/usr/local/lib64/R-2.15.3
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$R_HOME/bin
export PATH
export LD_LIBRARY_PATH=$R_HOME/lib/libR.so,$JAVA_HOME/lib/amd64/server/libjvm.so

To my understanding, that should set JAVA_HOME, R_HOME, PATH, and LD_LIBRARY_PATH globally for all users on the server. I know Tomcat runs under root and I can confirm that root was able to see all the above paths as set above via "echo $JAVA_HOME", "echo $R_HOME", "echo $LD_LIBRARY_PATH", "echo $PATH"

So I'm not sure why it's complaining that it can't open those .so files.

Also, when it crashes out, it shuts down Tomcat.

Thanks!

user2203980
  • 51
  • 1
  • 3

2 Answers2

3

I had the same issue when I was using R libraries with tomcat. It couldn't find R_HOME.

The solution is to update a file that sets the path for tomcat because tomcat sets its own variables. The file is "yourPathToTomcat/tomcat/bin/setclasspath.sh", open it and add at the end "export R_HOME=yourPathToR" (just like what you added in your linux environments e.g: export R_HOME=/usr/lib/R). Then you can run your app and it will work. Hope It might help someone. :D

Yan_RN
  • 31
  • 3
2

To use R from Java you will need to install JRI. Fortunately, JRI is now a part of rJava and is installed with it.

JRI will require its own native shared library which is already installed with rJava. To locate JRI installed with rJava, use

    system.file("jri",package="rJava")

from inside of R [command-line]. Above command will give you a path. You will be able to find

libjri.so

which is the shared library JRI is looking for. You can specify this path retrieved above through JAVA_OPTS as

    -Djava.library.path=${path-retrieved-from-R}

which will be passed on to the JVM settings on initialization of Tomcat.

If you are using multiple libraries then please group the library path java option accordingly.