You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@karaf.apache.org by dsjaxen <do...@siemens.com> on 2014/08/22 17:48:49 UTC

bundle specific classloaders

Hi!
I have a couple bundles each of which includes a groovy class loader which
uses the thread context
classloader as its parent class loader.  The idea is to run groovy scripts
in the class loading context
of each bundle.  So bundle A which imports C, D, & E bundles would allow a
groovy script compiled
and executed in the context of bundle A to see classes from A, C, D, & E. 
Groovy scripts running in bundle B would see a different set of classes
(possibly different versions of C, D, or E).

I am using karaf 2.3.1, aries blueprint 1.0.0, & spring 3.0.7.

I have been having issues getting the right parent classloader for the
groovy classloader.
I have seen the following:
      a)  Groovy classloader is created by a class created as an OSGi
service
           o Using thread context classloader as the parent loader, the
groovy classloader sees all
              classes exported from all bundles [not just those imported by
the bundle]
           o Using class.getClassloader() as the parent loader, the groovy
classloader does not see
              classes imported by the bundle.
      b)  Groovy classloader is created on the fly as a request is processed
           o Using the thread context classloader as the parent, the groovy
classloader does not see
              classes imported by the bundle.

Using the one classloader, most things work but if multiple versions of
classes are used within the container the wrong class could be used.  Also,
if the bundle is reloaded references to classes loaded
previously cause class cast exceptions.

Is it possible to get a parent classloader for the groovy compiler that will
get me the bundle's classpath?

Thanks in advance,
-Doug



--
View this message in context: http://karaf.922171.n3.nabble.com/bundle-specific-classloaders-tp4034883.html
Sent from the Karaf - User mailing list archive at Nabble.com.

Re: bundle specific classloaders

Posted by David Bosschaert <da...@gmail.com>.
Hi Doug,

Would the classloader for a specific bundle help here? It would give
you access to what the bundle can see plus what it contains itself.
You can obtain the bundle's classloader in two ways:
1. The easiest way is via the Bundle Wiring. If you have a bundle
object, you can call bundle.adapt(BundleWiring.class) and then call
BundleWiring.getClassLoader() [1]
2. If you have an actual class that you know for sure is served by the
bundle, you can obtain it's classloader simply by calling
Class.getClassLoader()

Cheers,

David

[1] http://www.osgi.org/javadoc/r5/core/org/osgi/framework/wiring/BundleWiring.html

On 22 August 2014 16:48, dsjaxen <do...@siemens.com> wrote:
> Hi!
> I have a couple bundles each of which includes a groovy class loader which
> uses the thread context
> classloader as its parent class loader.  The idea is to run groovy scripts
> in the class loading context
> of each bundle.  So bundle A which imports C, D, & E bundles would allow a
> groovy script compiled
> and executed in the context of bundle A to see classes from A, C, D, & E.
> Groovy scripts running in bundle B would see a different set of classes
> (possibly different versions of C, D, or E).
>
> I am using karaf 2.3.1, aries blueprint 1.0.0, & spring 3.0.7.
>
> I have been having issues getting the right parent classloader for the
> groovy classloader.
> I have seen the following:
>       a)  Groovy classloader is created by a class created as an OSGi
> service
>            o Using thread context classloader as the parent loader, the
> groovy classloader sees all
>               classes exported from all bundles [not just those imported by
> the bundle]
>            o Using class.getClassloader() as the parent loader, the groovy
> classloader does not see
>               classes imported by the bundle.
>       b)  Groovy classloader is created on the fly as a request is processed
>            o Using the thread context classloader as the parent, the groovy
> classloader does not see
>               classes imported by the bundle.
>
> Using the one classloader, most things work but if multiple versions of
> classes are used within the container the wrong class could be used.  Also,
> if the bundle is reloaded references to classes loaded
> previously cause class cast exceptions.
>
> Is it possible to get a parent classloader for the groovy compiler that will
> get me the bundle's classpath?
>
> Thanks in advance,
> -Doug
>
>
>
> --
> View this message in context: http://karaf.922171.n3.nabble.com/bundle-specific-classloaders-tp4034883.html
> Sent from the Karaf - User mailing list archive at Nabble.com.