CXF should use class' classloader for initialization of its loggers
-------------------------------------------------------------------
Key: CXF-2893
URL: https://issues.apache.org/jira/browse/CXF-2893
Project: CXF
Issue Type: Bug
Affects Versions: 2.2.9
Reporter: Hynek Mlnarik
Priority: Trivial
The class org.apache.cxf.common.logging.LogUtils should attempt to use plain
Class.forName(cname) if Class.forName(cname, true,
Thread.currentThread().getContextClassLoader()) fails.
Rationale: Current thread might not be able to access cxf classes. Take as an
example the following OSGi bundles:
1) bundle with a http server
2) bundle with CXF-based servlet SomeCXFServlet
A servlet SomeCXFServlet from bundle (2) has access to CXF via
SomeCXFServlet.class.getClassloader(), similarly for LogUtils class via its
classloader. However, its initialization is performed from http server thread
that does not have access to bundle (2) classes. Initialization of a logger is
hence also made from the http thread. CXF tries to load its
org.apache.cxf.common.logging.*Logger classes - the attempt however fails
because the current thread's classloader is used instead of the LogUtils'.
Solution: Try to load the class using Class.forName(cname) if
Class.forName(cname, true, Thread.currentThread().getContextClassLoader())
fails.
Diff to solve this issue follows:
*** orig\org\apache\cxf\common\logging\LogUtils.java 2010-07-08
13:13:36.000000000 +0200
--- new\org\apache\cxf\common\logging\LogUtils.java 2010-07-14
08:43:01.481043100 +0200
***************
*** 92,102 ****
}
}
if (!StringUtils.isEmpty(cname)) {
! loggerClass = Class.forName(cname.trim(), true,
!
Thread.currentThread().getContextClassLoader());
getLogger(LogUtils.class).fine("Using " +
loggerClass.getName() + " for logging.");
}
} catch (Throwable ex) {
--- 92,108 ----
}
}
if (!StringUtils.isEmpty(cname)) {
! try {
! loggerClass = Class.forName(cname.trim(), true,
!
Thread.currentThread().getContextClassLoader());
! } catch (Throwable ex) {
! loggerClass = Class.forName(cname.trim());
! }
getLogger(LogUtils.class).fine("Using " +
loggerClass.getName() + " for logging.");
}
} catch (Throwable ex) {
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.