Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
1.0
-
None
-
Operating System: other
Platform: Other
-
9845
Description
I've got Log4J 1.1.3 JAR in my classpath. Upon startup of my application
(actually a JUnit test case), I immediately get:
java.lang.ExceptionInInitializerError:
org.apache.commons.logging.LogConfigurationException:
java.lang.ClassCastException
So I downloaded the Commons Logging 1.0 source and debugged. The problem is in
org.apache.commons.logging.impl.LogFactoryImpl.guessConfig().
Class proxyClass=findClassLoader().
loadClass( "org.apache.commons.logging.Log4jFactory" );
The above loadClass call should be changed to:
Class proxyClass=findClassLoader().
loadClass( "org.apache.commons.logging.impl.Log4jFactory" );
However, after I make the above change I still get a ClassCastException, now
from org.apache.commons.logging.LogFactory.newFactory(). This exception
baffles me. It happens at:
return (LogFactory) clazz.newInstance();
So I modify newFactory() to do the newInstance() and the return in two steps
instead of one.
Object result = clazz.newInstance();
return (LogFactory)result;
The exception occurs during the cast of result. If I print result's class name
I get org.apache.commons.logging.impl.LogFactoryImpl. But checking if result
is an instanceof org.apache.commons.logging.impl.LogFactoryImpl returns false.
Object result = clazz.newInstance();
System.out.println("Got Factory: " + result.getClass().getName());
if (result instanceof LogFactory) {
System.out.println("result is a LogFactory");
}
if (result instanceof org.apache.commons.logging.impl.LogFactoryImpl) {
System.out.println("result is a LogFactoryImpl");
}
return (LogFactory) result;
The code above just prints:
Got Factory: org.apache.commons.logging.impl.LogFactoryImpl
And then throws the ClassCastException. I'm confused.