What I've done using Spring + OSGi is:
1) create a library bundle for Spring that just exports all the spring classes
2) created some hooks following the patterns of the Spring Remoting
classes: OSGIExporter and OSGIImporter that publish spring beans as
OSGI services or import OSGI services for use by spring beans
3) each bundle that wants to export beans creates an application
context in its activator (Abstract class that does that) and uses the
OSGI Exporter to publish those beans
The activator is set via a manifest entry as to which services are
required before it can launch the application context, so it waits to
launch the application context until all required services are
available, and restarts the application context if those services
change.
Basically it uses the OSGI service mechanism to integrate spring beans
in different bundles. As far as classloading stuff goes, all it
required was that any thing you are exposing for other application
contexts to import has to be properly configured in your manifest as
an exported package and imported by the consuming bundle.
It's not pretty but it works. Unfortunately I can't publish the code
for it, but it wasn't too hard to build.
-Cameron
On 10/18/06, Joe Toth <[EMAIL PROTECTED]> wrote:
> I'm relatively new to OSGi, but I'm learning. I have a question regarding
> classloading.
>
> I'm trying to have a Spring based plug-in/bundle serve up beans to other
> bundles. In one bundle I add all the spring stuff and spring works fine in
> that one bundle (its called org.omegaframework.system). Now I'm trying to
> initialize Spring with an applicationContext.xml from another bundle (called
> org.omegaframework.example). I know the 2 bundles have different
> classloaders so I have to do something in the Spring bundle to let it know
> about the classpath from the other bundle.
>
> I tried 2 methods:
> 1. Using Equinox's BuddyLoader by putting...
> Eclipse-RegisterBuddy: org.omegaframework.system in the example bundle.
> And Eclipse-BuddyPolicy: registered in the system bundle.
> This didn't work, plus I'm looking for a platform independent way to do it
> anyway, if possible.
>
> 2. Passing the classloader...This method is in the system bundle and is
> called from the example bundle. I tried passing
> ExampleActivator.class.getClassloader() and
> this.getClassLoader()
>
> public void init(String applicationContextXMLFile, ClassLoader
> classLoader) {
>
> Thread current = Thread.currentThread();
> ClassLoader original = current.getContextClassLoader();
> current.setContextClassLoader(classLoader);
> try {
> context = new ClassPathXmlApplicationContext(
> new String[] { applicationContextXMLFile },
> this.getClass());
> } catch (Exception e) {
> e.printStackTrace();
> } finally {
> current.setContextClassLoader(original);
> }
>
> }
>
>
> I can't get either to work. I've only tested on Equinox 3.3
>
> Is there a "standard" way to allow a bundle access to another bundles
> classpath?
>
> Thanks
>
> _______________________________________________
> general mailing list
> [email protected]
> http://lists.ops4j.org/mailman/listinfo/general
>
>
>
_______________________________________________
general mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/general