Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

The basic goal is to do things the maven way and reduce custom configuration code in our build. This makes , making our build more reliable, understandable, and maintainable over the long run. A second goal is to solve a long-standing problem where the uimaj-ep-runtime plugin, if open in the workspace, made compiling and launching of other plugins that depended on it, not work.

...

A basic principle is to put all the bundle info that normally would go into the MANIFEST.MF part of the Eclpse plugin into the configuration in the POM for the maven-bundle-plugin, and use that to generate the manifest.mf. This gives just one place to maintain this information. The plugin.xml (used to describe extension points) is still needed if the plugin defines extension points. Some plugins have "blank" plugin.xml - these can just be deleted. The build.properties file is not used, either. (it is used only for Eciipse Eclipse building the plugins, and we instead have Maven do that).Running

What does the maven-bundle-plugin do?

It builds the actual plugin jar file. Along the way, takes the information in the POM and uses it to construct the MANIFEST.MF file; we arrange to have this file in the spot where Eclipse PDE expects it, so the plugin can be developed in Eclipse. The <dependencies> are used to augment where the maven-bundle-plugin searches for packages to export; however, it is the configuration information in the maven-bundle-plugin that specifies what to do, specifically

Some details:

  • The POM dependencies are used when maven compiles the code for the plugin, and are used by the bundling to find dependencies and do the right "imports" for them in the generated manifest.
  • The configuration for the bundle plugin is where the specifics of what goes into the plugin, what gets exported, what needs to be imported, are specified.
  • Any additional things that need to go into the resulting manifest.mf to support the Eclipse plugin can be put in the POM as configuration specs for the bundle plugin; it will pass these along.

The uimaj-ep-runtime plugin - a special case

This is a library plugin, consisting of jars from other projects. It is built using the maven-bundle-plugin capabilities to specify what packages to export, using the <_exportcontents> directive. This directive avoids actually including those packages in the bundle as direct classes, (versus using the normal <Export-Package> directive. The reason to exclude these, is that another later directive), because a later instruction, <Embed-Dependency>, specifies using the dependency information to embed the Jar files maven builds for those, in the bundle being built. Since the jars already have the packages, we use <_exportcontents> to avoid duplicating these contents.

The One thing the bundle plugin does is to follow dependency chains in the things it's including. When the uimaj-adapter-soap was included, the bundle plugin determined this needed the axis jars; these are not however part of our distribution. Because of this, the uimaj-adapter-soap dependency is commented out at this point, because it would seem it could not work - it, in turn, depends on axis files that we don't distribute. It's left in as a comment, in case a user wants to build a version of this with the axis files included.One of the benefits of using the maven-bundle-plugin is increased reliability - it "discovered" this dependency within the uimaj-adapter-soap on axis.

Making the uimaj-ep-runtime plugin work in Eclipse when open

Previously, this This plugin had has an empty src and empty target/classes because all the source/class files were in other projects, it just was a collector of their Jars. This is no longer a problem because the (maven) dependencies problem is avoided now by changing other projects that previously <depended> on the runtime plugin in other projects were changed to depend instead depend on the individual components . Some messages in the maven world suggest this is a better thing to do.When these plugins get built, the builder uses the depenedencies when looking for packages to export or just include. But only those packages that are listed in the Export-Packages or Private-Packages will be put into the bundle that is built. So it doesn't hurt to have these project "depend" in the maven sense on parts of uimaj-ep-runtime that they depend onruntime plugin.

These dependencies allow both maven and Eclipse to compile the source of the plugins.

The bundle will create "uses" clauses for packages from the dependencies that it actually uses. See next sectionl

...

These help insure correct "wiring" of the right versions of classes, in the case where multiple versions are present. For more on this, see http://underlap.blogspot.com/2007/10/osgi-type-safety-and-uses-directive.htmlImage Added

Sometimes additions are needed for <Import-Package>

The Eclipse-built manifests put in Require-Bundle entries for things you list in as bundle dependencies. You can continue to do this, also, using the maven-bundle-plugin because it will just pass thru any instructions that start with capital letters like "Require-Bundle" to the manifest.

...