Ad

Tomcat Cant Pick Class-path From Manifest File

- 1 answer

Tomcat Version :5.0.28 JDK: 1.5.0.14

The problem:

I am using both hibernate and struts We are not on the latest and greatest of the version for these libraries So- both need a different version of apache-commons library.

The solution I have in mind:

Use manifest file and specify a different version of apache-commons for each

My web app is deployed as webapps\myapp

And the lib is webapps\myapp\WEB-INF\lib

I modified the Manifest.mf in hibernate3.jar as follows

Manifest-Version: 1.0

Archiver-Version: Plexus Archiver Created-By: 1.5.0_15-b04 (Sun> Microsystems Inc.) Class-Path: hibernatelib/slf4j-api-1.5.2.jar

and put the slf4j-api-1.5.2.jar in webapps\myapp\WEB-INF\lib\hibernatelib

Now I would expect that slf4j-api-1.5.2.jar would be loaded automatically along with hibernate But its not working... Tomcat is unable to find the jar files specified in the .MF as above

The Question:

  1. Am I doing something wrong? or is it Tomcat ?
  2. Is there another solution to this problem ?

I have already tried\checked the following

  1. Checked for new-line characters at the end of the file
  2. If I put slf4j-api-1.5.2.jar in the main lib folder- the error goes away- so I know its not able to find this particular jar file
  3. Tried relative, absolute path in the manifest file
Ad

Answer

The only place where the Class-Path attribute in the manifest is used is when the jar containing the manifest is called as an executable jar using ("java -jar theFile.jar").

Some servlet containers seem to support it, but according to this mailing list post (Sorry, couldn't find anything more authorative so quickly) it's not specified in the spec either.

As far as I understand it, web applications generally load their classes using a single class loader. "Correctly" solving that dependency problem would require at least 2 different classloaders.

A hack-ish solution might be to use jarjar or a similar tool to package the different libraries together with their respective dependencies.

So you'd produce one jar containing Hibernate together with its apache-commons library and another jar containing struts together with its apache-commons library. Each copy of the apache-commons library would be moved to different packages (possibly hibernate.org.apache.* and struts.org.apache.*) to solve the problem with different classe versions.

Ad
source: stackoverflow.com
Ad