Gunnar's suggestions may be the better
approach but will require you to place more of your "outer" application
into real bundles. That is something you may not be in the position
I was suggesting a system.bundle fragment
as a way to add exports to the system.bundle without having to override
the default org.osgi.framework.systempackages property which is set by
the framework according the the execution environment you are on. Basically
this would be a shell fragment that would not contain any code. Instead
it is just exposing more packages that are available from the host's classloader
by exporting them it the fragment's bundle manifest. The META-INF/MANIFEST.MF
for the system.bundle fragment would look something like this ...
This fragment bundle is simply adding
the exports my.app.pkg1 and my.app.pkg2 to the exports of the system.bundle
(org.eclispe.osgi). This will allow other bundles to import the packages.
As long as the classloader of the framework has access to the packages
it will be able to load the classes for other bundles. This fragment
bundle would be installed just like the other bundles you are installing
into the framework.
Gunnar Wagenknecht <gunnar@xxxxxxxxxxxxxxx> Sent by: equinox-dev-bounces@xxxxxxxxxxx
02/12/2007 12:44 AM
Please respond to
Equinox development mailing list <equinox-dev@xxxxxxxxxxx>
[equinox-dev] Re: Adding to the framework
> Hi Tom, thanks for the suggestion. Only reason i don't think this
> work (and maybe i'm wrong?) is that i need my host application to
> instances (services) to the bundles, so for example my host application
> creates in instance of FooService, and then registers it with the
> BundleContext of the Equinox framework. However, unless i somehow
> Equinox that the package is available from the host (parent classloader)
> it won't let any bundle load that depends on this package. So far
> not seeing how Fragment Bundles can solve this problem, because they
> seem like they need to be full bundles and not just passed in, but
> could be some API or technique i'm not familiar with?
The system bundle is "org.eclipse.osgi". It exports the system
Fragments contribute to the classpath of their bundle host. Thus, if you
create a fragment to "org.eclipse.osgi" you can add the packages
your application to the set of exported packages of the system bundle,
which makes them available to all bundles.
For registering your services from the host application I suggest
creating a bundle that is started when the framework is started. This
bundle can register any OSGi services, etc. It could be also the
fragment you created above.