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

Johno Crawford commented on LOG4J2-1971:
----------------------------------------

[~dahn] we recently ran into the same problem after updating to log4j 2.9.1 [2] 
we were able to work around it by excluding the log4j package using the 
PowerMockIgnore annotation [1].

[1]

{code:java}
@RunWith(PowerMockRunner.class)
@PowerMockIgnore({"javax.management.*", "org.apache.*", "com.sun.*"})
public class MyTest { }
{code}

[2]

{noformat}
java.util.ServiceConfigurationError: org.apache.logging.log4j.spi.Provider: 
Provider org.apache.logging.log4j.core.impl.Log4jProvider not a subtype

        at java.util.ServiceLoader.fail(ServiceLoader.java:239)
        at java.util.ServiceLoader.access$300(ServiceLoader.java:185)
        at 
java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
        at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
        at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
        at 
org.apache.logging.log4j.util.ProviderUtil.loadProviders(ProviderUtil.java:101)
        at 
org.apache.logging.log4j.util.ProviderUtil.<init>(ProviderUtil.java:67)
        at 
org.apache.logging.log4j.util.ProviderUtil.lazyInit(ProviderUtil.java:142)
        at 
org.apache.logging.log4j.util.ProviderUtil.hasProviders(ProviderUtil.java:126)
        at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:89)
        at AbstractDao.<clinit>(AbstractDao.java:45)
        at 
sun.reflect.GeneratedSerializationConstructorAccessor6.newInstance(Unknown 
Source)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at 
org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:48)
        at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:73)
        at 
org.mockito.internal.creation.instance.ObjenesisInstantiator.newInstance(ObjenesisInstantiator.java:14)
        at 
org.powermock.api.mockito.repackaged.ClassImposterizer.createProxy(ClassImposterizer.java:144)
        at 
org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:59)
        at 
org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMethodInvocationControl(DefaultMockCreator.java:121)
        at 
org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMock(DefaultMockCreator.java:69)
        at 
org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.mock(DefaultMockCreator.java:46)
        at org.powermock.api.mockito.PowerMockito.mock(PowerMockito.java:204)
        at 
org.powermock.api.extension.listener.AnnotationEnabler.standardInject(AnnotationEnabler.java:118)
        at 
org.powermock.api.extension.listener.AnnotationEnabler.beforeTestMethod(AnnotationEnabler.java:63)
        at 
org.powermock.tests.utils.impl.PowerMockTestNotifierImpl.notifyBeforeTestMethod(PowerMockTestNotifierImpl.java:91)
        at 
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:298)
        at 
org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
        at 
org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
        at 
org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
        at 
org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
        at 
org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
        at 
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:288)
        at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
        at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
        at 
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:208)
        at 
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:147)
        at 
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:121)
        at 
org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
        at 
org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
        at 
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:123)
        at 
org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:121)
        at 
org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
        at 
org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at 
com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
        at 
com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
        at 
com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
        at 
com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
{noformat}

> ClassCastException: org.eclipse.osgi.internal.loader.SystemBundleLoader$1 
> cannot be cast to java.lang.ClassLoader
> -----------------------------------------------------------------------------------------------------------------
>
>                 Key: LOG4J2-1971
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-1971
>             Project: Log4j 2
>          Issue Type: Bug
>    Affects Versions: 2.8
>            Reporter: liwenxian2017
>             Fix For: 2.9.0
>
>
> When I migrated log4j from log4j 1.2.17 to log4j 2.8, There is an Exception 
> like this:
> java.lang.ClassCastException: 
> org.eclipse.osgi.internal.loader.SystemBundleLoader$1 cannot be cast to 
> java.lang.ClassLoaderat 
> org.eclipse.osgi.internal.resolver.BundleDescriptionImpl$DescriptionWiring.getClassLoader(BundleDescriptionImpl.java:1229)
>  ~[org.eclipse.osgi.jar:?]at 
> org.apache.logging.log4j.core.osgi.Activator.scanBundleForPlugins(Activator.java:70)
>  ~[log4j-core.jar:2.8]at 
> org.apache.logging.log4j.core.osgi.Activator.bundleChanged(Activator.java:91) 
> ~[log4j-core.jar:2.8]at 
> org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:847)
>  ~[org.eclipse.osgi.jar:?]at 
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
>  ~[org.eclipse.osgi.jar:?]at 
> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
>  ~[org.eclipse.osgi.jar:?]at 
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1568)
>  ~[org.eclipse.osgi.jar:?]at 
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1504)
>  ~[org.eclipse.osgi.jar:?]at 
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1499)
>  ~[org.eclipse.osgi.jar:?]at 
> org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:247)
>  ~[org.eclipse.osgi.jar:?]at 
> org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438)
>  ~[org.eclipse.osgi.jar:?]at 
> org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1)
>  ~[org.eclipse.osgi.jar:?]at 
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
>  ~[org.eclipse.osgi.jar:?]at 
> org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)
>  ~[org.eclipse.osgi.jar:?]
> I checked Activator.java in log4j-core:
> ...
> 86 @Override
> 87 public void bundleChanged(final BundleEvent event) {
> 88  switch (event.getType()) {
> 89   // FIXME: STARTING instead of STARTED?
> 90   case BundleEvent.STARTED:
> 91    scanBundleForPlugins(event.getBundle());
> 92   break;
> in line 91, it called scanBundleForPlugins for every bundles. But in line 
> 60-61, it does not scan system bundle for plugins
> 57 private static void scanInstalledBundlesForPlugins(final BundleContext 
> context) {
> 58    final Bundle[] bundles = context.getBundles();
> 59    for (final Bundle bundle : bundles) {
> 60       // LOG4J2-920: don't scan system bundle for plugins
> 61       if (bundle.getState() == Bundle.ACTIVE && bundle.getBundleId() != 0) 
> {
> 62          // TODO: bundle state can change during this
> 63          scanBundleForPlugins(bundle);
> And org.eclipse.osgi_3.8.1 's bundle ID is just 0. So it skipped bundle 
> org.eclipse.osgi in line 61-63. but it does not in line 91
> If I changed line 91 to:
>   if (event.getBundle().getState() == Bundle.ACTIVE && 
> event.getBundle().getBundleId() != 0) {
>     scanBundleForPlugins(event.getBundle());
>   }
> The exception goes away.
> So is this a bug? Or this is NOT a bug and there is a workaround for this 
> Exception? Thanks.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to