Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0

...

The basic information for how to do this comes from the maven-bundle-plugin documentation: http://felix.apache.org/site/maven-bundle-plugin-bnd.htmlImage Removed

This plugin supports "library project" plugins which are just collections of other jars, put into a plugin - exactly what our uimaj-ep-runtime plugin is.

...

The mechanism in the maven-bundle-plugin that creates "uses" clauses for packages from the dependencies is turned off, because that feature isn't properly supported in Eclipse 3.2. Therefore, if there are multiple versions of these packages that are present, be aware that mis-wiring may occur. For more on this, see http://underlap.blogspot.com/2007/10/osgi-type-safety-and-uses-directive.htmlImage Removed

Sometimes additions are needed for <Import-Package>

...

To handle these cases, those plugins which don't compile after the bundle builds the manifest.mf, because they are missing includes, have the required includes added to the POM.

Some issues solved

The first issue we hit concerned "wrong wiring". What would happen would be that several testers would try out the plugins, on various platforms (Windows, Linux, etc), and things would work. An then one would report a failure. We traced this to Eclipse's use of split packages. (Background - You can see the list of Eclipse's split packages by going to the Eclipse "Help" and then searching for the terms: split packages map)

Our first attempt was to wire a package to a particular bundle. This worked, but "incrementally" - it would solve one problem, only to have some testing done later reveal yet another (different) instance of the split package problem.
Since, in general, it could be the case that "both" sources of a package would need to be included, we changed the approach to use Require-Bundle for all the bundles that could supply classes for the split-package. This, by itself, didn't work - we think it was because the OSGi spec says that if you have both an "import-package" and a "Require-Bundle", the Import-Package takes precedence. Here's the quote from the OSGi spec on this:

A bundle may both import packages (via Import-Package) and require one
or more bundles (via Require-Bundle), but if a package is imported via
Import-Package, it is not also visible via Require-Bundle: Import-Package
takes priority over Require-Bundle, and packages which are exported by a
required bundle and imported via Import-Package must not be treated as
split packages.

So - the next work-around was to add a negative pattern to the Import-Package for just those packages which were split - to avoid having them imported. This seemed to work.

The next issue we ran into happened when we tried to use our plugins in Eclipse 3.2.x, which doesn't support the "uses" clause. The fix here was to eliminate the "uses" clauses, by (a) using version 1.4.0 of the maven-bundle-plugin, and (b) adding a <_nouses>true</_nouses> instruction. We also found a further motivation found for not generating the "uses" clause: this note from the Eclipse project developers mailing list: http://dev.eclipse.org/mhonarc/lists/stp-dev/msg01624.html (concerning performance issues with "uses" clauses).

Other issues we tackled: the maven build of these plugins would work, but the Eclipse build would often give the following kinds of errors:
Access restriction: The method <some-method-name>() from the type <some-class-name> is not accessible due to restriction on required project <some-project-name>

If you opened the project properties and looked at the Java Build Path, and expanded the plugin-dependencies, you could, indeed, see there were "Access rules" for the <some-project-name>, but these rules would be missing the pattern which covered the case for the package where <some-class-name> lived.
The fix for this (probably really a workaround?) was to add an explicit "import" for these packages to the POM's maven-bundle-plugin instruction: <Import-Package> to import these packages. I don't really understand why this worked, or why the maven-bundle-plugin didn't import these automagically (the Import-Package list of packages included "*" as one of the items, which I think means to import all the packages that were referenced, but not locally available).

Scopes and <optional> in dependencies

...