Search code examples
mavenosgitychomaven-bundle-plugin

Should I use POM first or MANIFEST first when developing OSGi application with Maven?


There are two main approaches when developing an OSGi application with Maven: POM-first and MANIFEST first.

I'm looking for an answer that is in a form of a table that shows pros and cons of each method.

To be more specific, I would also like to know how it relates to:

  • Maturity of toolset
  • Vendor independence
  • Development ease (which includes finding people who can do the development on the tooling)
  • Compatibility
  • Avoiding ClassNotFound
  • Avoiding manual work

Solution

  • At present this is what I can come up with

    POM-First Pros (using maven-bundle-plugin)

    • Leverages existing Maven skills, repositories and tooling.
    • Likely easier to find people who know how to manage pom.xml rather than MANIFEST.MF along with pom.xml
    • Most of the information in MANIFEST.MF can be obtained from the pom.xml itself.
    • Can work with other IDEs not just Eclipse based ones.
    • Less invasive, just add the single plugin and change the packaging type to "bundle"

    POM-First Cons

    • ClassNotFoundException more likely to occur at runtime. However, this can be mitigated using pax-exam (although it is very complicated to set up).
    • Still need to understand how the MANIFEST is setup to make sure the instructions configuration element is set correctly.

    MANIFEST-first Pros (using tycho-maven-plugin)

    • Seems to be the recommended approach, or at least talked about as the recommended approach, but I can't really see why it has significant benefit. (Hence why this question was asked).
    • Good for developing Eclipse plugins and integrates well with PDE
    • Provides tooling for testing thus allowing ClassNotFoundException to appear during JUnit testing rather than runtime.

    MANIFEST-first Cons

    • Seems to only work well on Eclipse based IDEs. You don't have to use Eclipse, but without the PDE would you want to?
    • Violates DRY principles since I have to do put keep the names and versions from the POM and MANIFEST.MF in sync.
    • Need to name things in a specific fashion
    • You cannot mix, meaning existing Maven multi-project installations cannot just tack on OSGi support
    • A lot more configuration compared to maven-bundle-plugin is needed to get less warnings: http://wiki.eclipse.org/Tycho/Reference_Card#Examplary_parent_POM
    • Have to make test cases a separate project. It won't run when built in src/test/java.
    • Seems that it will only test classes that are exposed, in other words those in ".internal." is not testable.

    If I were asked for a recommendation for an enterprise that is using Maven already and want to move to OSGi then it would be POM first

    If I were asked for a recommendation for someone who is doing Eclipse plugin development, then it is Manifest first -- with tycho