[ https://issues.apache.org/jira/browse/LOG4J2-373?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13889088#comment-13889088 ]
Matt Sicker commented on LOG4J2-373: ------------------------------------ Shouldn't you be loading the bundles like so: log4j-api is the host bundle, and then use the OSGi bundles from there. Log4j-api should be using its own class loader in this case. I've got some ideas on how to approach this in an API modification, but I'll have to flesh them out first. > 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