views:

2714

answers:

4

Summary

Is that possible for webapps deployed on linux + tomcat5.5 to use/see all /usr/share/java/ jars automatically?

Details

I'm packaging my java webapp for Ubuntu (yet the question is related to any linux-based distro) and going to make it depend on tomcat.

I'm going to put context descriptor (an xml file) to /usr/share/tomcat5.5/conf/Catalina/localhost/ to make my app deployed. Having my web dir here: /usr/share/<appname>/web, how can I enable my app to use java jar libs installed in the system (/usr/share/java)?

I can't just symlink /usr/share/java -> <webdir>/WEB-INF/lib, since I have my custom jars need to be placed in lib dir.

Bad Solution

The solution I've found so far is to symlink each required jar to <webdir>/WEB-INF/lib/.

This is not so good, because I have to symlink a lot of jars and even worse to symlink all jars my direct dependency lib (jar) requires (and so on). In case my direct dependency lib changes its list of required jars I'll have to maintain that symlinks.

+1  A: 

According to the Tomcat classloading documentation, you need to put any shared libs that should be available to all Tomcat apps in the $CATALINA_BASE/shared/lib library -- so one way to do what you're looking to do is to move your libraries from /usr/share/java to $CATALINA_BASE/shared/lib.

BUt if I'm not misunderstanding that same documentation, Tomcat also makes the system-wide CLASSPATH variable's contents available to the classloader at launch, so if your directory -- /usr/share/java -- were included in the system-wide CLASSPATH variable, then that should work too. I've never done this, though; Tomcat's method of making the contents of $CATALINA_BASE/shared/lib available Tomcat-wide has always served me perfectly.

delfuego
A: 

You have two options, one is to let the classloader provide the libraries to all java programs and the other is to let the classloader provide the libraries to all tomcat contexts.

Add your symlinks to /usr/lib/jvm/java-1.5.0-sun-1.5.0.11/jre/lib (note you may need to specify a different version in this path) to allow all java programs access to these libraries or add them to Tomcat's shared libraries at var/lib/tomcat5.5/shared/libs (again, the version number may be different) for access by all Tomcat contexts.

I should also note that these directory locations were taken from Ubuntu "Feisty".

Steve Moyer
A: 

You should not do that. JEE applications are the supposed to be self sufficient and not depend on any resources outside the deployment package other than those provided by the container. So you should take the libs you need from that directory and add it to your war or ear package.

This guarantees that your application will behave the same wherever you deploy it and you will not be subject to unexpected changes in the versions of the libs in /usr/share/java....

entzik
I can see the reason in your answer and even can agree with you.The problem this leads to huge .deb packages and clearly against linux distros packaging ideology.I tend to think about .jar the same way as about .so files.Does this mean linux distros just not well suited for packaging web apps?
Yurii Soldak
I've decided symlink concrete jars into webapp's lib directory and depend on concrete versions of libraries to ensure changes in /usr/share/java do not affect my app (see more detailed description in my answer to this question)
Yurii Soldak
A: 
Yurii Soldak