iirc, this is a known bug/problem (can't seem to find the bug right
now so). At least afaik, it is exactly as you describe - proxy is
assuming it can get access to everything via the one classloader
despite it has the correct classes already :-(

regards,

Karl

On Fri, Jun 3, 2011 at 5:28 PM, Sahoo <[email protected]> wrote:
> Have you noted that it complained about bundle m3 not being able to load
> javax.naming.Name and not javax.naming.Context?
>
> Sahoo
>
> On Thursday 02 June 2011 08:58 AM, Thiago Souza wrote:
>>
>> Hi,
>>
>>       Moreover, that's exactly what your exceptions are telling. m3 should
>> see javax.naming and m2 should see javax.sql also, since A2 extends from A1
>> which see javax.sql.
>>
>> Cheers
>>
>> On Thu, Jun 2, 2011 at 00:25, Thiago Souza <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>>    Hello,
>>
>>           As far as I could understand, you iterate between two CL.
>>    The one from module 2 (p2.A2.class.getClassLoader()) imports
>>    javax.naming, but the one from the activator's class
>>    (getClass().getClassLoader()) from module 3 does NOT imports
>>    javax.naming, so if you try to proxy using this last classloader
>>    it won't be possible since p2.A2 interface extends from
>>    javax.naming.Context.
>>           If this is the problem, to fix it module 3 must import
>>    javax.naming
>>
>>           Hope this helps.
>>
>>    Cheers
>>
>>    On Wed, Jun 1, 2011 at 17:11, Sahoo <[email protected]
>>    <mailto:[email protected]>> wrote:
>>
>>        Hi,
>>
>>        I am having a strange problem using dynamic proxies. I am
>>        being forced to import more classes than required. I have
>>        reduced it to a simple scenario as shown below:
>>
>>        module 1:
>>        package p1;
>>        public interface A1 extends javax.sql.PooledConnection {
>>        }
>>
>>        Export-Package: p1
>>        Import-Package: javax.sql
>>
>>        module 2:
>>        package p2;
>>        public interface A2 extends javax.naming.Context, p1.A1 {
>>        }
>>
>>        Export-Package: p2
>>        Import-Package: javax.naming, p1
>>
>>        module 3:
>>        Bundle-Activator: p3.Activator
>>        Import-Package: p2, org.osgi.framework
>>
>>        public class Activator implements BundleActivator {
>>         public void start(BundleContext ctx) throws Exception {
>>          for (ClassLoader cl : new
>>        ClassLoader[]{getClass().getClassLoader(),
>>        p2.A2.class.getClassLoader()}) {
>>           try {
>>            System.out.println(cl);
>>            Object obj = Proxy.newProxyInstance(cl, new
>>        Class[]{p2.A2.class},
>>                       new InvocationHandler() {
>>                           public Object invoke(Object proxy, Method
>>        method, Object[] args) throws Throwable {return null;}
>>                       });
>>            System.out.println(obj);
>>           } catch(Throwable e) {
>>            e.printStackTrace();
>>           }
>>          } // for
>>         }
>>         public void stop(BundleContext ctx) throws Exception {}
>>        }
>>
>>        It fails like this:
>>
>>        3.0
>>        java.lang.NoClassDefFoundError: javax.naming.Name
>>        <http://javax.naming.Name> not found by m3 [3]
>>           at $Proxy0.<clinit>(Unknown Source)
>>           at
>>        sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
>>        Method)
>>           at
>>
>>  sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
>>           at
>>
>>  sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>>           at
>>        java.lang.reflect.Constructor.newInstance(Constructor.java:513)
>>           at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:588)
>>           at p3.Activator.start(Activator.java:11)
>>           at
>>
>>  org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:633)
>>           at
>>        org.apache.felix.framework.Felix.activateBundle(Felix.java:1822)
>>           at
>>        org.apache.felix.framework.Felix.startBundle(Felix.java:1739)
>>           at
>>
>>  org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1143)
>>           at
>>
>>  org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
>>           at java.lang.Thread.run(Thread.java:619)
>>        2.0
>>        java.lang.NoClassDefFoundError:
>>        javax.sql.StatementEventListener not found by m2 [2]
>>           at $Proxy1.<clinit>(Unknown Source)
>>           at
>>        sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
>>        Method)
>>           at
>>
>>  sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
>>           at
>>
>>  sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>>           at
>>        java.lang.reflect.Constructor.newInstance(Constructor.java:513)
>>           at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:588)
>>           at p3.Activator.start(Activator.java:11)
>>           at
>>
>>  org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:633)
>>           at
>>        org.apache.felix.framework.Felix.activateBundle(Felix.java:1822)
>>           at
>>        org.apache.felix.framework.Felix.startBundle(Felix.java:1739)
>>           at
>>
>>  org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1143)
>>           at
>>
>>  org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
>>           at java.lang.Thread.run(Thread.java:619)
>>
>>        It seems to me that JVM is assuming that the defining loader
>>        of the proxy class can load every class that appear in the
>>        signature of methods that can be invoked using the proxy
>>        class. Anybody interested to debug can use the attached
>>        sample. Just unzip and run run.sh after editing path to Felix.
>>
>>        Thanks,
>>        Sahoo
>>
>>
>>
>>
>>  ---------------------------------------------------------------------
>>        To unsubscribe, e-mail: [email protected]
>>        <mailto:[email protected]>
>>        For additional commands, e-mail: [email protected]
>>        <mailto:[email protected]>
>>
>>
>>
>
>



-- 
Karl Pauls
[email protected]
http://twitter.com/karlpauls
http://www.linkedin.com/in/karlpauls
https://profiles.google.com/karlpauls

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to