Getting the benefits of maven-bundle-plugin in other project types
Note: This information is partially available at http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html
The goal here is to be able to use a different packaging type than "bundle", say "war" packaging, and still get benefits of the maven-bundle-plugin. The major benefit is of course having the manifest being generated by the BND tool.
If your project is packaged as "war", you can still use the maven-bundle-plugin to generate the manifest if you add "war" to supportedProjectTypes:
<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <configuration> <supportedProjectTypes> <supportedProjectType>jar</supportedProjectType> <supportedProjectType>bundle</supportedProjectType> <supportedProjectType>war</supportedProjectType> </supportedProjectTypes>
Here is a more complete configuration that I use for generating a manifest using BND and adding it to the WAR:
<project xmlns="http://maven.apache.org/POM/4.0.0" ...> ... <properties> <bundle.symbolicName>myartifact</bundle.symbolicName> <bundle.namespace>myartifact</bundle.namespace> </properties> <modelVersion>4.0.0</modelVersion> <groupId>mygroup</groupId> <artifactId>myartifact</artifactId> <version>1.0-SNAPSHOT</version> <name>${bundle.symbolicName}</name> <packaging>war</packaging> <build> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <archive> <!-- add the generated manifest to the war --> <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <executions> <execution> <id>bundle-manifest</id> <phase>process-classes</phase> <goals> <goal>manifest</goal> </goals> </execution> </executions> <configuration> <supportedProjectTypes> <supportedProjectType>jar</supportedProjectType> <supportedProjectType>bundle</supportedProjectType> <supportedProjectType>war</supportedProjectType> </supportedProjectTypes> <instructions> <Bundle-SymbolicName>${bundle.symbolicName}</Bundle-SymbolicName> <Bundle-Version>${pom.version}</Bundle-Version> <!-- | assume public classes are in the top package, and private classes are under ".internal" --> <Export-Package>!${bundle.namespace}.internal.*,${bundle.namespace}.*;version="${pom.version}"</Export-Package> <Private-Package>${bundle.namespace}.internal.*</Private-Package> <!-- | each module can override these defaults in their osgi.bnd file --> <_include>-osgi.bnd</_include> </instructions> </configuration> </plugin> </plugins> </build>
Now we can get a bundle with a BND-generated manifest installed in the repo as a .war.
For JAR packaging, you'd replace appropriate parts of above with:
<plugin> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <!-- add the generated manifest to the archive --> <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile> </archive> </configuration> </plugin>
Embedding Dependencies
If you use at least maven-bundle-plugin version 1.4.3, it should apply the Embed-Dependency
instruction for both the bundle and manifest goals - however, because the manifest goal doesn't
actually end up building the final bundle then you might find some minor differences.
But you can definitely use this to generate the Bundle-ClassPath even with "war" packaging.
You can configure Embed-Dependency to match the location the WAR plugin uses.
For example perhaps something like:
<configuration> <supportedProjectTypes> <supportedProjectType>jar</supportedProjectType> <supportedProjectType>bundle</supportedProjectType> <supportedProjectType>war</supportedProjectType> </supportedProjectTypes> <instructions> <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath> <Embed-Directory>WEB-INF/lib</Embed-Directory> <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency> <Embed-Transitive>true</Embed-Transitive> <Import-Package>*;resolution:=optional</Import-Package> </instructions> </configuration>
Example
Hendy Irawan has created a project to demonstrate:
- Apache CXF
- OSGi
- Pax Web Service
- Pax Web Extender War
- Maven
- Maven Bundle Plugin
- configuring it for WAR project
- Maven Pax Plugin
Checkout from here: (Subversion)
https://scm.ops4j.org/repos/ops4j/laboratory/users/ceefour/cxf-osgi-sample
This might be helpful with regards to the above, or how to mix and match the combinations.
Note that this is not an official sample, just a contribution.