Thanks for the explanation. One question though:

The problem I had (log4j classes were present in jar:s in the Windows
CLASSPATH which caused them to found by the application classloader)
disappeared  when using Equinox instead of Felix. What is Felix doing
different than Equinox? Is Equinox by default setting the CCL to null?

/Bengt


2012/11/27 Karl Pauls <karlpa...@gmail.com>

> The problem is the context classloader. You have to make sure you set the
> context classloader to null when starting felix and when calling into felix
> from the outside.
>
> The thing is, threads inherit the current context class loader.
> Furthermore, the context classloader gets set by the servlet container when
> the bridge servlet is called.
>
> The problem is that log4j is stupid and assumes that it should use the
> context classloader first to try to find classes. That isn't going to work
> when log4j is comming from a bundle -- hence, you have two options:
>
> 1. Set the context classloader to null while creating the framework
> instance and starting it _and_ set it to null when calling into the
> framework from the outside (_make sure_ to _set it back_ when you return).
>
> 2. Don't provide log4j from a bundle but make it available via the system
> bundle (i.e., use a version that you have outside and delegate it down).
>
> regards,
>
> Karl
>
>
> On Tue, Nov 27, 2012 at 8:26 AM, Bengt Rodehav <be...@rodehav.com> wrote:
>
> > Hello Charles,
> >
> > I recently had a similar problem that I brought up on the Karaf user
> list:
> >
> >
> >
> http://mail-archives.apache.org/mod_mbox/karaf-user/201211.mbox/%3CCAJ0TPG%2BERzf6Q709cndh-YqfP_HQq%3DVk6iA4ZQfEtZE7tJPWUw%40mail.gmail.com%3E
> >
> > Although my problem was that the application classloader had already
> loaded
> > some log4j classes due to the CLASSPATH environment variable on Windows,
> I
> > noted that everything worked fine using Equinox instead of Felix.
> >
> > Apparently Equinox does some tricks when it comes to hiding already
> loaded
> > classes. Maybe Felix developers can take a look at what Equinox is doing
> > and perhaps do something similar in Felix thus making Felix more
> resilient
> > to "polluted" classloaders.
> >
> > /Bengt
> >
> >
> >
> > 2010/11/18 Charles Moulliard <cmoulli...@gmail.com>
> >
> > > Hi,
> > >
> > > Some months ago, an interesting question has been drawn about the
> > > classloading issue of log4j class when we use pax-logging bundle within
> > > Felix embedded in a web application.
> > >
> > > http://www.mail-archive.com/**dev@felix.apache.org/msg04908.**html<
> > http://www.mail-archive.com/dev@felix.apache.org/msg04908.html>
> > >
> > > I'm faced to the same issue when I would like to use Apache Karaf (top
> > > level container of Apache Felix) deployed as a WAR.
> > >
> > > Does anybody has find a trick to solve the classloading issue ?
> > >
> > > INFO: locking
> > > 2010-11-18 18:08:36.667:INFO::Started SelectChannelConnector@0.0.0.**
> > > 0:8080 <http://SelectChannelConnector@0.0.0.0:8080>
> > > [INFO] Started Jetty Server
> > > [INFO] Starting scanner at interval of 10 seconds.
> > > log4j:ERROR A "org.apache.log4j.**ConsoleAppender" object is not
> > > assignable to a "org.apache.log4j.Appender" variable.
> > > log4j:ERROR The class "org.apache.log4j.Appender" was loaded by
> > > log4j:ERROR [4.0] whereas object of type
> > > log4j:ERROR "org.apache.log4j.**ConsoleAppender" was loaded by
> > > [ContextLoader@ServiceMix Embedded Example].
> > >
> > >
> > > Regards,
> > >
> > > Charles M.
> > > Apache Camel, ServiceMix & Karaf committer
> > >
> >
>
>
>
> --
> Karl Pauls
> karlpa...@gmail.com
> http://twitter.com/karlpauls
> http://www.linkedin.com/in/karlpauls
> https://profiles.google.com/karlpauls
>

Reply via email to