[ 
https://issues.apache.org/jira/browse/LOG4J2-373?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13882238#comment-13882238
 ] 

Ralph Goers commented on LOG4J2-373:
------------------------------------

In core the osgi core jar is marked as provided since it would be expected to 
already be present in an OSGi environment. I would expect the same should be 
done for these dependencies. However, in core that code path will only execute 
if a bundleresource url is encountered. In this case it seems like it will 
invoke the OSGi framework for everything which clearly isn't OK. The patch 
should be reworked to detect if an OSGi environment is present (i.e. - detect 
if the FrameworkUtil class is present) before attempting to call it.

> Classloader issue in OSGi-environment
> -------------------------------------
>
>                 Key: LOG4J2-373
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-373
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: API, Core
>    Affects Versions: 2.0-beta9
>         Environment: OSGi R5 / R4 (Apache Felix 4.x)
>            Reporter: Roland Weiglhofer
>            Priority: Critical
>              Labels: ClassLoader, OSGI
>         Attachments: log4j-api.patch
>
>
> Using Log4j2 in a bundle causes following error:
> ERROR StatusLogger org.apache.logging.log4j.core.impl.Log4jContextFactory 
> does not implement org.apache.logging.log4j.spi.LoggerContextFactory
> ERROR StatusLogger Unable to locate a logging implementation, using 
> SimpleLogger
> printing the ClassLoaders in LogManager gives me following output:
> org.apache.logging.log4j.spi.LoggerContextFactory loaded by 
> org.apache.logging.log4j-api [13]
> org.apache.logging.log4j.core.impl.Log4jContextFactory loaded by 
> sun.misc.Launcher$AppClassLoader@35a16869
> We have two different ClassLoaders. That's why the implementation is not 
> assignable. The core uses the bootstrap-classloader and the api uses the 
> bundle-classloader.
> Workaround needed. Thx
> addendum:
> ProviderUtil.findClassLoader() returns the bootstrap-classloader but not the 
> bundle-classloader of the log4j2-core. The log4j2-core is a fragment of the 
> log4j2-api bundle. Thus, ProviderUtil.findClassLoader() must return the 
> bundle-classloader of log4j2-api. This a bug for the case that log4j2-core is 
> used as the implementation. There are other cases that will also cause 
> problems. Further investigations are necessary.
> Workaround:
> 1. check if log4j2 runs in an OSGI container.
> Bundle mybundle = org.osgi.framework.FrameworkUtil.getBundle(MyClass.this);
> 2. if(mybundle != null), than get bundle-classloader of log4j2-impl.
> mybundle.adapt(BundleWiring.class).getClassLoader();



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-dev-h...@logging.apache.org

Reply via email to