Search code examples
javawebsphereclassloaderslf4j

websphere classloader gives java.lang.LinkageError when loading slf4j LoggerFactory


[I originally posted this on the websphere forums bot didn't see a timely response. I'm re-posting here with slightly more content]

The Problem

I added a jar (call it "Foo.jar") to our enterprise application (i.e. ".ear"), created the manifest entry, etc., and found, to my surprise, that when my EJB instantiated FooClient, websphere threw a java.lang.LinkageError upon org.slf4j.LoggerFactory

I've added classloader debugging to the trace and did not find much. I was hoping to see "where WAS actually found the slf4j class". Here are the entries:

[9/24/14 16:23:01:417 CDT] 00000067 CompoundClass >  loadClass org.slf4j.LoggerFactory this=com.ibm.ws.classloader.CompoundClassLoader@5c2687e4[app:yourappServer] Entry

[9/24/14 16:23:01:418 CDT] 00000067 CompoundClass <  loadClass org.slf4j.LoggerFactory java.lang.LinkageError: org.slf4j.LoggerFactory Exit

I've checked my was8 directory and found various copies/versions of the slf4j jar.

/plugins
        /osgiappbundles/com.ibm.ws.osgi.applications/aries/slf4j-api-1.5.6.jar
        /slf4j-api-1.5.6.jar

/profiles/AppSrv01
        /installedConnectors/activemq-rar-5.9.1.rar/slf4j-api-1.7.5.jar
        /wstemp
                /appdepl14769b0c2de/slf4j-api-1.7.5.jar3472682177251273594.tmp
                /appdepl14769b0c2de/slf4j-api-1.7.5.jar7922145899030561292.tmp

Another developer told me "you won't be able to use Foo.jar" because we would need to put "Parent_last" and that's not an option for this project currently.

Additional Context

  • Websphere 8.0.0.7
  • RAD 9

Questions

  • java.lang.LinkageError : is this a 'classloader problem' or 'wrong version of class' problem? My experience with "wrong version of class" problems I usually see "NoSuchMethod" errors, not instantiation exceptions.

  • Any other way around this?

Updates

I read a bit about shared libraries and "isolated classloader" and this seemed the solution. However for some reason, my RAD/Eclipse UI seems broken as it does not 'save' when I associate the shared library with an application or module. It subsequently disappears.

thanks in advance


Solution

  • Check the version of SL4J expected by Foo.jar and the one you are using: they are surely different. Ensure the correct version has precedence in your classpath: you can put it in WEB-INF/lib but also check that you have just one version of it in WEB-INF/lib.

    To discover which SL4J jar you are using you can run

    java -verbose:class ....
    

    and the JVM will dump out what it's loading, and from where.

    You say "I usually see NoSuchMethod errors" instead of LinkageError; in this case the method exists but has some other incompatibility.