Uploaded image for project: 'Weld'
  1. Weld
  2. WELD-2083

IllegalAccessError is thrown by proxies with non public classes

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: Blocker Blocker
    • None
    • 2.3.2.Final
    • Proxies
    • None

      Non public interface producer

      With the following:

      /* package-private */ interface NonPublicInterface {
      }
      
      @Produces
      @ApplicationScoped
      NonPublicInterface producer() {
      }
      

      With Weld SE, the following exception is thrown:

      Caused by: org.jboss.weld.exceptions.WeldException: WELD-001524: Unable to load proxy class for bean Producer Method [NonPublicInterface] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces @ApplicationScoped producer()] with class class java.lang.Object using classloader sun.misc.Launcher$AppClassLoader@5ce345c2
      Caused by: java.lang.RuntimeException: java.lang.IllegalAccessError: class org.jboss.weld.proxies.NonPublicInterface$1654568476$Proxy$_$$_WeldClientProxy cannot access its superinterface NonPublicInterface
      Caused by: java.lang.IllegalAccessError: class org.jboss.weld.proxies.NonPublicInterface$1654568476$Proxy$_$$_WeldClientProxy cannot access its superinterface NonPublicInterface
      

      For injection points within the same package. Note that works fine with OpenWebBeans.

      Private nested class

      With the following:

      import com.codahale.metrics.MetricRegistry;
      
      @Produces
      @ApplicationScoped
      MetricRegistry registry = new MetricRegistry();
      

      With Weld OSGi (in Karaf with PAX CDI) and JDK 7 (HotSpot build 1.7.0_80-b15), the following exception is thrown:

      Caused by: com.google.common.util.concurrent.ExecutionError: java.lang.IllegalAccessError: tried to access class com.codahale.metrics.MetricRegistry$MetricBuilder from class com.codahale.metrics.MetricRegistry$Proxy$_$$_WeldClientProxy
      	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2256)
      	at com.google.common.cache.LocalCache.get(LocalCache.java:3990)
      	at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3994)
      	at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4878)
      	at org.jboss.weld.util.cache.LoadingCacheUtils.getCacheValue(LoadingCacheUtils.java:49)
      	at org.jboss.weld.util.cache.LoadingCacheUtils.getCastCacheValue(LoadingCacheUtils.java:74)
      	at org.jboss.weld.bean.proxy.ClientProxyProvider.getClientProxy(ClientProxyProvider.java:222)
      	at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:755)
      	at org.jboss.weld.manager.BeanManagerImpl.getInjectableReference(BeanManagerImpl.java:861)
      	at org.jboss.weld.injection.ParameterInjectionPointImpl.getValueToInject(ParameterInjectionPointImpl.java:76)
      	at org.jboss.weld.injection.ConstructorInjectionPoint.getParameterValues(ConstructorInjectionPoint.java:150)
      	at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:75)
      	at org.jboss.weld.injection.producer.AbstractInstantiator.newInstance(AbstractInstantiator.java:28)
      	at org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:116)
      	at org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:179)
      	at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:158)
      	at org.jboss.weld.context.AbstractContext.get(AbstractContext.java:96)
      	at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:101)
      	at org.jboss.weld.bean.ContextualInstanceStrategy$ApplicationScopedContextualInstanceStrategy.get(ContextualInstanceStrategy.java:141)
      	at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50)
      	at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:761)
      	at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:784)
      	at org.jboss.weld.util.ForwardingBeanManager.getReference(ForwardingBeanManager.java:61)
      	at org.jboss.weld.bean.builtin.BeanManagerProxy.getReference(BeanManagerProxy.java:85)
      	at io.astefanutti.metrics.cdi.MetricsExtension.getBeanInstance(MetricsExtension.java:123)
      	at io.astefanutti.metrics.cdi.MetricsExtension.configuration(MetricsExtension.java:99)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:606)
      	at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:88)
      	... 44 more
      Caused by: java.lang.IllegalAccessError: tried to access class com.codahale.metrics.MetricRegistry$MetricBuilder from class com.codahale.metrics.MetricRegistry$Proxy$_$$_WeldClientProxy
      	at com.codahale.metrics.MetricRegistry$Proxy$_$$_WeldClientProxy.<clinit>(Unknown Source)
      	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
      	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
      	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
      	at java.lang.Class.newInstance(Class.java:383)
      	at org.jboss.weld.bean.proxy.DefaultProxyInstantiator.newInstance(DefaultProxyInstantiator.java:43)
      	at org.jboss.weld.bean.proxy.ProxyFactory.run(ProxyFactory.java:307)
      	at org.jboss.weld.bean.proxy.ProxyFactory.create(ProxyFactory.java:299)
      	at org.jboss.weld.bean.proxy.ClientProxyFactory.create(ClientProxyFactory.java:83)
      	at org.jboss.weld.bean.proxy.ClientProxyProvider.createClientProxy(ClientProxyProvider.java:198)
      	at org.jboss.weld.bean.proxy.ClientProxyProvider.createClientProxy(ClientProxyProvider.java:188)
      	at org.jboss.weld.bean.proxy.ClientProxyProvider.access$100(ClientProxyProvider.java:46)
      	at org.jboss.weld.bean.proxy.ClientProxyProvider$CreateClientProxy.load(ClientProxyProvider.java:57)
      	at org.jboss.weld.bean.proxy.ClientProxyProvider$CreateClientProxy.load(ClientProxyProvider.java:53)
      	at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3589)
      	at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2374)
      	at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2337)
      	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2252)
      	... 74 more
      

      Because MetricRegistry contains a private nested class.

      The same test run with JDK 8 (HotSpot build 1.8.0_66-b17) throws a different exception:

      org.jboss.weld.exceptions.WeldException: WELD-001524: Unable to load proxy class for bean Producer Field [MetricRegistry] with qualifiers [@Default @Named @Any] declared as [[BackedAnnotatedField] @Produces @ApplicationScoped @Named org.apache.camel.cdi.sample.metrics.MetricsCdiConfig.registry] with class class com.codahale.metrics.MetricRegistry using classloader BundleClassLoader{bundle=[DelegatingBundle: [io.astefanutti.camel.cdi.camel-cdi-sample-metrics [15], org.ops4j.pax.cdi.weld [87], org.jboss.weld.osgi-bundle [73], io.astefanutti.metrics.cdi.metrics-cdi [16], io.astefanutti.camel.cdi.camel-cdi [14]]],parent=null}
      	at org.jboss.weld.bean.proxy.ProxyFactory.getProxyClass(ProxyFactory.java:364)
      	at org.jboss.weld.bean.proxy.ProxyFactory.run(ProxyFactory.java:327)
      	at org.jboss.weld.bean.proxy.ProxyFactory.create(ProxyFactory.java:319)
      	at org.jboss.weld.bean.proxy.ClientProxyFactory.create(ClientProxyFactory.java:83)
      	at org.jboss.weld.bean.proxy.ClientProxyProvider.createClientProxy(ClientProxyProvider.java:198)
      	at org.jboss.weld.bean.proxy.ClientProxyProvider.createClientProxy(ClientProxyProvider.java:188)
      	at org.jboss.weld.bean.proxy.ClientProxyProvider.access$100(ClientProxyProvider.java:46)
      	at org.jboss.weld.bean.proxy.ClientProxyProvider$CreateClientProxy.load(ClientProxyProvider.java:57)
      	at org.jboss.weld.bean.proxy.ClientProxyProvider$CreateClientProxy.load(ClientProxyProvider.java:53)
      	at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3589)
      	at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2374)
      	at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2337)
      	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2252)
      	at com.google.common.cache.LocalCache.get(LocalCache.java:3990)
      	at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3994)
      	at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4878)
      	at org.jboss.weld.util.cache.LoadingCacheUtils.getCacheValue(LoadingCacheUtils.java:49)
      	at org.jboss.weld.util.cache.LoadingCacheUtils.getCastCacheValue(LoadingCacheUtils.java:74)
      	at org.jboss.weld.bean.proxy.ClientProxyProvider.getClientProxy(ClientProxyProvider.java:222)
      	at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:736)
      	at org.jboss.weld.manager.BeanManagerImpl.getInjectableReference(BeanManagerImpl.java:842)
      	at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92)
      	at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:378)
      	at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:389)
      	at org.jboss.weld.injection.producer.ResourceInjector$1.proceed(ResourceInjector.java:70)
      	at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48)
      	at org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:72)
      	at org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:121)
      	at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:159)
      	at org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:70)
      	at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:101)
      	at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50)
      	at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:742)
      	at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:765)
      	at org.jboss.weld.util.ForwardingBeanManager.getReference(ForwardingBeanManager.java:61)
      	at org.jboss.weld.bean.builtin.BeanManagerProxy.getReference(BeanManagerProxy.java:85)
      	at io.astefanutti.metrics.cdi.MetricsExtension.getBeanInstance(MetricsExtension.java:123)
      	at io.astefanutti.metrics.cdi.MetricsExtension.configuration(MetricsExtension.java:99)
      	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:497)
      	at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:88)
      	at org.jboss.weld.injection.MethodInvocationStrategy$SpecialParamPlusBeanManagerStrategy.invoke(MethodInvocationStrategy.java:144)
      	at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:309)
      	at org.jboss.weld.event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserverMethodImpl.java:124)
      	at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:287)
      	at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:265)
      	at org.jboss.weld.event.ObserverNotifier.notifySyncObservers(ObserverNotifier.java:271)
      	at org.jboss.weld.event.ObserverNotifier.notify(ObserverNotifier.java:260)
      	at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:154)
      	at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:148)
      	at org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:53)
      	at org.jboss.weld.bootstrap.events.AbstractDeploymentContainerEvent.fire(AbstractDeploymentContainerEvent.java:35)
      	at org.jboss.weld.bootstrap.events.AfterDeploymentValidationImpl.fire(AfterDeploymentValidationImpl.java:28)
      	at org.jboss.weld.bootstrap.WeldStartup.validateBeans(WeldStartup.java:450)
      	at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:90)
      	at org.ops4j.pax.cdi.weld.impl.WeldCdiContainer.createBeanManager(WeldCdiContainer.java:115)
      	at org.ops4j.pax.cdi.weld.impl.WeldCdiContainer.access$000(WeldCdiContainer.java:55)
      	at org.ops4j.pax.cdi.weld.impl.WeldCdiContainer$1.call(WeldCdiContainer.java:95)
      	at org.ops4j.pax.cdi.weld.impl.WeldCdiContainer$1.call(WeldCdiContainer.java:91)
      	at org.ops4j.pax.swissbox.core.ContextClassLoaderUtils.doWithClassLoader(ContextClassLoaderUtils.java:60)
      	at org.ops4j.pax.cdi.weld.impl.WeldCdiContainer.doStart(WeldCdiContainer.java:91)
      	at org.ops4j.pax.cdi.spi.AbstractCdiContainer.start(AbstractCdiContainer.java:87)
      	at org.ops4j.pax.cdi.extender.impl.CdiExtender.createContainer(CdiExtender.java:184)
      	at org.ops4j.pax.cdi.extender.impl.CdiExtender.addingBundle(CdiExtender.java:133)
      	at org.ops4j.pax.cdi.extender.impl.CdiExtender.addingBundle(CdiExtender.java:64)
      	at org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:469)
      	at org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:415)
      	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.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444)
      	at org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:916)
      	at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:835)
      	at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:517)
      	at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4541)
      	at org.apache.felix.framework.Felix.startBundle(Felix.java:2172)
      	at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)
      	at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984)
      	at org.apache.karaf.features.internal.service.FeaturesServiceImpl.startBundle(FeaturesServiceImpl.java:1189)
      	at org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:836)
      	at org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvision(FeaturesServiceImpl.java:1079)
      	at org.apache.karaf.features.internal.service.FeaturesServiceImpl$1.call(FeaturesServiceImpl.java:975)
      	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      	at java.lang.Thread.run(Thread.java:745)
      Caused by: java.lang.RuntimeException: java.lang.LinkageError: loader (instance of  org/ops4j/pax/swissbox/core/BundleClassLoader): attempted  duplicate class definition for name: "com/codahale/metrics/MetricRegistry$Proxy$_$$_WeldClientProxy"
      	at org.jboss.weld.util.bytecode.ClassFileUtils.toClass(ClassFileUtils.java:101)
      	at org.jboss.weld.bean.proxy.ProxyFactory.createProxyClass(ProxyFactory.java:484)
      	at org.jboss.weld.bean.proxy.ProxyFactory.getProxyClass(ProxyFactory.java:357)
      	... 86 more
      Caused by: java.lang.LinkageError: loader (instance of  org/ops4j/pax/swissbox/core/BundleClassLoader): attempted  duplicate class definition for name: "com/codahale/metrics/MetricRegistry$Proxy$_$$_WeldClientProxy"
      	at java.lang.ClassLoader.defineClass1(Native Method)
      	at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
      	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:497)
      	at org.jboss.weld.util.bytecode.ClassFileUtils.toClass2(ClassFileUtils.java:108)
      	at org.jboss.weld.util.bytecode.ClassFileUtils.toClass(ClassFileUtils.java:97)
      	... 88 more
      

      Package private class

      With the following:

      /* package-private */ class MyBean {
      }
      

      With Weld OSGi (in Karaf with PAX CDI), the following exception is thrown:

      Caused by: java.lang.IllegalAccessError: class MyBean$Proxy$_$$_WeldClientProxy cannot access its superclass MyBean
      	at java.lang.ClassLoader.defineClass1(Native Method)
      	at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:606)
      	at org.jboss.weld.util.bytecode.ClassFileUtils.toClass2(ClassFileUtils.java:108)
      	at org.jboss.weld.util.bytecode.ClassFileUtils.toClass(ClassFileUtils.java:97)
      	... 75 more
      

      For injection point within the same package and same bundle.

              Unassigned Unassigned
              astefanu@redhat.com Antonin Stefanutti
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

                Created:
                Updated:
                Resolved: