Jon Friis wrote:
Hello

I have a problem with log4j and commons-logging which i really hope anybody can help me with.
Setup:
Windows 2000, Apache Tomcat 6.0, JRE 1.6.0_02, log4j-1.2.15, commons-logging annd i am using eclipse 3.3.0

Since i have multiple Web services on the same Tomcat server i have been putting log4j.jar in WEB-INF/lib and log4j.properties in WEB-INF/classes.


Note that this presumes child-first classloading, and that may not be the case if you are running it from Eclipse. If you run Tomcat Standalone, you will have child-first for sure. If you don't have log4j.jar anywhere in a parent classloader, this is less of an issue, but it still may not find your log4j.properties file if one exists in a parent classloader without using child-first classloading. Even in the case where you have child-first, but have log4j.xml in a parent classloader, since log4j.xml is used in preference to log4j.properties, log4j.xml will get used instead. Sorry to get a little off track. More below...

My problem is some kind of class-loading problem where log4j and commons-logging won't find each other.

2 scenarios:

1) commons-logging.jar and log4j.jar are both put in WEB-INF/lib for my webapp.


If, indeed, parent-first, rather than child-first, classloading is being done, then this may not work if commons-logging exists in a parent classloader. It will not see log4j.jar in a child classloader.

2) commons-logging.jar is put in tomcat 6.0/lib (Common classloader according to tomcat 6.0 doc) and log4j.jar in WEB-INF/lib.


Can you think of a way where commons-logging would be able to find log4j.jar in this scenario? Classloaders look up, not down. If you put log4j.jar in WEB-INF/lib and have libraries that depend on commons-logging, then you must also put commons-logging.jar alongside log4j.jar. Of course, you already tried that above. Hmmm....

The stacktraces of both scenarios are given below.

Question is: Why can't they see each other and how can i solve the problem ?

Can it really be so that i have to wrap the log4j class (as describe in the log4j book) and can someone explain why and will it help ?

Any feed back or solution hints are really appreciated :-)


Try this. Put log4j.jar and commons-logging.jar (make sure it's not commons-logging-api.jar) in Tomcat's "lib" directory. For per-app logging, you'll also need either a repository selector (search the list for info) or child-first classloading, plus log4j.jar and commons-logging.jar in WEB-INF/lib (in addition to having them in Tomcat's "lib" directory).

And see Tomcat's logging doc to see how to enable Log4j logging for Tomcat's own logging, instead of having to configure JUL...

http://tomcat.apache.org/tomcat-6.0-doc/logging.html
http://tomcat.apache.org/tomcat-6.0-doc/extras.html

Jake

Thx
Jon Friis

Scenario 1)
--------------------------------------------------

25-10-2007 16:47:24 org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet /FAS threw load() exception
java.lang.NoClassDefFoundError: org.apache.commons.logging.LogFactory
at org.apache.axis.components.logger.LogFactory.class$(LogFactory.java:45) at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45)
        at java.security.AccessController.doPrivileged(Native Method)
at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41) at org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:33) at org.apache.axis.transport.http.AxisServlet.<clinit>(AxisServlet.java:75)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
at org.apache.axis.transport.http.AxisServletBase.class$(AxisServletBase.java:59) at org.apache.axis.transport.http.AxisServletBase.<clinit>(AxisServletBase.java:58) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at java.lang.Class.newInstance0(Class.java:355)
        at java.lang.Class.newInstance(Class.java:308)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1104) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4042) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4348) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:516) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
25-10-2007 16:47:25 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080

Scenario 2)
--------------------------------------------------

java.lang.NoClassDefFoundError: org/apache/log4j/Category
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
        at java.lang.Class.getConstructor0(Class.java:2699)
        at java.lang.Class.getConstructor(Class.java:1657)
at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:410) at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529) at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
        at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:370)
at org.apache.axis.components.logger.LogFactory.getLog(LogFactory.java:37) at org.apache.axis.transport.http.AxisServlet.<clinit>(AxisServlet.java:75)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
at org.apache.axis.transport.http.AxisServletBase.class$(AxisServletBase.java:59) at org.apache.axis.transport.http.AxisServletBase.<clinit>(AxisServletBase.java:58) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at java.lang.Class.newInstance0(Class.java:355)
        at java.lang.Class.newInstance(Class.java:308)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1104) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4042) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4348) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:516) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
25-10-2007 17:02:14 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to