[
https://issues.apache.org/jira/browse/SHIRO-537?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16697774#comment-16697774
]
Steinar Bang commented on SHIRO-537:
------------------------------------
I tried to use the workaround mentioned in this bug, and in the linked-to
stackoverflow answer, but the activator still failed with the same stack trace.
With the workaround in place, the activate method looked like this:
{code:java}
@Activate
public void activate(BundleContext ctx) {
BundleWiring wiring = ctx.getBundle().adapt(BundleWiring.class);
ClassLoader bundleClassloader = wiring.getClassLoader();
Thread current = Thread.currentThread();
ClassLoader originalClassloader = current.getContextClassLoader();
current.setContextClassLoader(bundleClassloader);
try {
IniWebEnvironment webenvironment = new IniWebEnvironment();
webenvironment.setIni(INI_FILE);
webenvironment.setServletContext(getServletContext());
webenvironment.init();
DefaultWebSecurityManager securityManager =
(DefaultWebSecurityManager) webenvironment.getSecurityManager();
UkelonnRealm realm =
createRealmProgramaticallyBecauseOfShiroIniClassCastException();
securityManager.setRealm(realm);
setSecurityManager(securityManager);
setFilterChainResolver(webenvironment.getFilterChainResolver());
} finally {
current.setContextClassLoader(originalClassloader);
}
}
{code}
I've debugged into the activator, using remote debugging from eclipse into
apache karaf. And I have verified that a BundleContext is injected, and a
BundleWiring is successfully retrieved, and the classloaders are successfully
retrieved and replaced.
The activator fails (as before adding the workaround), when the
IniWebEnvironment() constructor tries to create a WebIniSecurityManagerFactory
instance using reflection.
The stack trace in karaf.log with the workaround in place, is:
{noformat}
2018-11-24T11:48:41,006 | ERROR | Thread-50 | security
| 171 - no.priv.bang.ukelonn.web.security - 1.0.0.SNAPSHOT |
[no.priv.bang.ukelonn.web.security.UkelonnShiroFilter(9)] The activate method
has thrown an exception
java.lang.NoClassDefFoundError:
org/apache/shiro/web/config/WebIniSecurityManagerFactory
at
org.apache.shiro.web.env.IniWebEnvironment.<init>(IniWebEnvironment.java:60)
~[?:?]
at
no.priv.bang.ukelonn.web.security.UkelonnShiroFilter.activate(UkelonnShiroFilter.java:67)
~[?:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
~[?:?]
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[?:?]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]
at
org.apache.felix.scr.impl.inject.BaseMethod.invokeMethod(BaseMethod.java:229)
~[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.inject.BaseMethod.access$500(BaseMethod.java:39)
~[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.inject.BaseMethod$Resolved.invoke(BaseMethod.java:650)
~[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.inject.BaseMethod.invoke(BaseMethod.java:506)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.inject.ActivateMethod.invoke(ActivateMethod.java:307)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.inject.ActivateMethod.invoke(ActivateMethod.java:299)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:298)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:109)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:906)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:879)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:823)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(ServiceRegistrationImpl.java:347)
[?:?]
at
org.apache.felix.framework.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:247)
[?:?]
at
org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:350)
[?:?]
at org.apache.felix.framework.Felix.getService(Felix.java:3737) [?:?]
at
org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:470)
[?:?]
at
org.ops4j.pax.web.extender.whiteboard.internal.tracker.AbstractTracker.addingService(AbstractTracker.java:168)
[242:org.ops4j.pax.web.pax-web-extender-whiteboard:6.0.9]
at
org.ops4j.pax.web.extender.whiteboard.internal.tracker.AbstractTracker.addingService(AbstractTracker.java:41)
[242:org.ops4j.pax.web.pax-web-extender-whiteboard:6.0.9]
at
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)
[?:?]
at
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:870)
[?:?]
at
org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)
[?:?]
at
org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) [?:?]
at
org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:901)
[?:?]
at
org.apache.felix.framework.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:990)
[?:?]
at
org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:838)
[?:?]
at
org.apache.felix.framework.EventDispatcher.fireServiceEvent(EventDispatcher.java:545)
[?:?]
at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4595)
[?:?]
at org.apache.felix.framework.Felix.registerService(Felix.java:3587)
[?:?]
at
org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:348)
[?:?]
at
org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:887)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:874)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:132)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:941)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:741)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:675)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:430)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:657)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:341)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:390)
[179:org.apache.felix.scr:2.0.12]
at org.apache.felix.scr.impl.Activator.access$200(Activator.java:54)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:265)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.utils.extender.AbstractExtender.createExtension(AbstractExtender.java:254)
[179:org.apache.felix.scr:2.0.12]
at
org.apache.felix.utils.extender.AbstractExtender.modifiedBundle(AbstractExtender.java:227)
[179:org.apache.felix.scr:2.0.12]
at
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:482)
[?:?]
at
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:415)
[?:?]
at
org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232) [?:?]
at
org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444)
[?:?]
at
org.apache.felix.framework.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:915)
[?:?]
at
org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:834)
[?:?]
at
org.apache.felix.framework.EventDispatcher.fireBundleEvent(EventDispatcher.java:516)
[?:?]
at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4579)
[?:?]
at org.apache.felix.framework.Felix.startBundle(Felix.java:2174) [?:?]
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)
[?:?]
at
org.apache.karaf.bundle.core.internal.BundleWatcherImpl.run(BundleWatcherImpl.java:125)
[22:org.apache.karaf.bundle.core:4.1.5]
at java.lang.Thread.run(Thread.java:748) [?:?]
{noformat}
> Class load issue in OSGI in ClassUtils
> --------------------------------------
>
> Key: SHIRO-537
> URL: https://issues.apache.org/jira/browse/SHIRO-537
> Project: Shiro
> Issue Type: Bug
> Affects Versions: 1.2.3
> Environment: OSGi Felix 4.0.3
> Reporter: Tom Nelson
> Priority: Major
>
> I had the same issue that is described in:
> http://stackoverflow.com/questions/20653146/how-to-load-class-in-an-osgi-e4-environment-while-using-shiro
> where it was suggested a bug was entered but never was, so here it is. A
> similar workaround worked for me:
> Thread currentThread = Thread.currentThread();
> ClassLoader originalCl = currentThread.getContextClassLoader();
> try {
> Class<?> clazz = ((InfrastructureServer)
> server).getBundleContext().getBundle()
>
> .loadClass(CustomRolePermissionResolver.class.getName());
> ClassLoader bundleClassLoader = clazz.getClassLoader();
> currentThread.setContextClassLoader(bundleClassLoader);
> webappContext.deploy(httpServer);
> } catch (ClassNotFoundException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> } finally {
> currentThread.setContextClassLoader(originalCl);
> }
> In addition, commons-collections 3.2.1 must be used in an OSGi environment, I
> suggest bumping your dependency.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)