Question

I have successfully managed to start Apache Felix from code and register an own Bundle.

Following relation between OSGI-projects is needed:

[OsgiInterface] -- provides interfaces.

[OsgiModuleA] -- (bundle) provides an implementation of those interfaces.
knows [OsgiInterface]

[OsgiUsage] -- makes use of one or more bundle.
knows [OsgiInterface] and [OsgiModuleA]

Now I have problems registering a service which implements an interface. I would guess that my entries in manifest.mf files are wrong.

Additional information

It would be very kind, if someone could look at the code in my previous question

Let me refer to this question:

I tried to create a third project OsgiInterfaces, which provides an interface SomeInterface in the package interfaces. This project is known by both OsgiModuleA and OsgiUsage.

OsgiModuleA: manifest.mf has now an additional value interfaces for the entry Import-Package:. Furthermore, there is an instance of SomeInterface provided to the activator.

When the bundle is started, an NoClassDefFoundError occurs: the interface SomeInterface is not known.

EDIT:

Now, that the error is fixed, I can tell, that the most important part was:

map.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
    "my.interfaces; version=1.0.0");

Without this, I got ClassCastException.

Was it helpful?

Solution

In the most basic form, services are registered in Java code, not using manifest or any other file. This usually happens in your BundleActivator.

Long      i     = new Long(20);    // the service implementation
Hashtable props = new Hashtable();
props.put("description", "This an long value");
bundleContext.registerService(Long.class.getName(), i, props);

I suggest you read a tutorial, like the one at Knopflerfish

An alternative is using Declarative Services, or the new Blueprint facility. Using either of these (or other non-standardized systems) you will declare your services in a (usually XML) file, instead of writing code to interact with the services registry.

But you should probably figure out the fundamentals manually first.

[OsgiUsage] -- makes use of one or more bundle. knows [OsgiInterface] and [OsgiModuleA]

It should not be necessary for the bundle that uses a service to know about the bundle that provides it. Both of them just need to know the service interface. In fact, bundles should not need to know about other bundles at all. They only need to import packages, and consume or provide services.

OTHER TIPS

I understand that you have SomeInterface in another bundle, right? Then you must also export that package in that bundle's manifest, eg.

Export-Bundle: interfaces

But you really should have a look at the bnd tool mentioned in another answer. This generates standard OSGi manifests.

I suggest you look at the iPOJO project. This make using Felix much easier.
https://felix.apache.org/documentation/subprojects/apache-felix-ipojo.html

I would say use bnd directly or maven-bundle-plugin to create OSGI enabled jars.

It's easier than writing the OSGI manifest yourself(typos, mistakes, missing imports/exports)

Trying wrapping the jars with bnd as a start.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top