I believe the confusion comes from mixing maven and osgi versioning
concepts, coupled with the difference between bundle version and package
version.

What OSGi sees is

A bundle with the name "osgi.core" of version 4.3.0.201102171602
A bundle with the name "org.apache.felix.framework" of version 4.0.0
Your bundle with the name "org.acme.foo" of version 1.0.0

What maven sees is

An artifact with the name "org.osgi.core" with the version 4.3.0 (note that
this is not the same as the bundle name OR version)
An artifact with the name "org.apache.felix.framework" of version 4.0.0
(note that this happens to coincide with the bundle name and version)
Your bundle with some artifactId (name) and version.

Now, these names and versions are different and applies to different
systems. The first 3 things above is concerning OSGi, the latter 3 things is
only applicable to maven. So, when you see a version number, you need to ask
yourself, "what system does this version apply to"? Is it OSGi or Maven or
some other versioning system?

So, org.apache.felix.framework 4.0.0 is both a bundle name/version and a
maven artifact name/version. The maven artifact contain classes and
interfaces and a project description file, all used to build the osgi
bundle. That osgi bundle contain a manifest file where the name of the
bundle, the version of the bundle and the exported/imported packages are
declared. One of the exported packages is org.osgi.framework version 1.6.

What has happend in your case is that you've likely told Maven to compile
your bundle with the dependency org.osgi.core version 4.3.0. When this was
done, maven built (with the help of maven-bundle-plugin) a bundle that
imports the package org.osgi.framework with version range [1.6, 2.0). You
then deployed this bundle into a container that does not export this package
in the given range.

Maven versions can (loosely) be seen as complie time versions while OSGi
versions are runtime versions. They are completely separate and even employ
different semantics when it comes to version numbers.

This wall of text likely didn't help you much but if you try and separate
(in your head) the build system from the deployment time system (maven vs.
osgi container) it may help.

Regarding your questions about gogo:

gogo has commands for inspecting bundles, what packages they export and
import. To see what packages that the osgi framework implementation (felix)
exports you type

inspect p c 0
or
inspect package capability 0

To see what your bundle need in terms of packages you type

inspect p r <bundle-id-of-your-bundle>
or
inspect package requirement <bundle-id-of-your-bundle>

You can also grep the results from these commands as in

inspect p c 0 | grep org.osgi

However, there is no way for gogo (that I know of) to inspect what version
the maven artifact is off. Some bundles might not even come from a maven
build but from, say, an ant build. Then there is (obviously) no way of
knowing the maven artifact version.

Hope this... does not confuse you more. :(

Regards,
Per-Erik Svensson

2011/10/7 Benoît Thiébault <[email protected]>

> Thank you Richard,
>
> Ok for the API version. I indeed compile against version 4.3:
>
> <dependency>
>    <groupId>org.osgi</groupId>
>    <artifactId>org.osgi.core</artifactId>
>    <version>4.3.0</version>
> </dependency>
>
> As I said in my previous post, when I do not set the version in BND, it
> crashes.
> However, when I configure the framework version like this, it works:
>
> <Import-Package>
>  org.osgi.framework;version="[1.3, 2.0)",
> ...
> </Import-Package>
>
> What I find confusing are all these version numbers:
> - API: 4.3
> - org.osgi.framework: between 1.3 and 2.0
> - felix: 4.0
>
> What is the correspondance between all these numbers? Does Felix 4
> supports API 4.3 and exports org.osgi.framework 1.3?
> Is there a way to check it (via a gogo command for instance)?
>
> Kind regards,
>
> Ben
>
>
> Le mardi 04 octobre 2011 à 20:01 -0400, Richard Hall a écrit :
> > Typically the version is inserted by bnd based on the version it compiles
> > against. If you are compiling it against R4.3 API and then deploying to
> an
> > R4.2 framework, then you might see this issue. You should always compile
> > against the lowest required version.
> >
> > -> richard
> >
> > 2011/10/4 Benoît Thiébault <[email protected]>
> >
> > > Hi,
> > >
> > > When starting my bundle, I have the following error:
> > >
> > > org.osgi.framework.BundleException: Unresolved constraint in bundle
> > > org-keridwen-vtk-linux64b [12]: Unable to resolve 12.0: missing
> > > requirement [12.0] package;
> > > (&(package=org.osgi.framework)(version>=1.6.0)(!(version>=2.0.0)))
> > >
> > > In the bundle manifest, I have the following entry:
> > > <Import-Package>
> > > org.osgi.framework,
> > > javax.swing.*
> > > </Import-Package>
> > >
> > > The osgi framework is set as an import, but no version is provided.
> > > How can I know what version to set here? I guess it depends on my felix
> > > install? How do I know what version is exported by the my felix
> > > framework?
> > >
> > > Kind regards
> > >
> > > Ben
> > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [email protected]
> > > For additional commands, e-mail: [email protected]
> > >
> > >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to