2.4. API Bundle
Overview
This section explains how to set up a Maven project for a typical API bundle.
The
hello-paris
bundle exemplifies an API bundle, which contains only public Java interfaces. Hence, the API bundle should export all of its own packages and associate a version number with the exported packages.
Directory structure
The
hello-paris
bundle has the following directory structure:
hello-paris/ | \--src/ | \--main/ | | | \--java/ | | | \--org/fusesource/example/hello/paris/ | | | \-HelloParis.java | \--test/
The Java source code is located under the
src/main/java
sub-directory. The org.fusesource.example.hello.paris
package is public and all of its classes and interfaces can be exported from the bundle.
There are no blueprint resources associated with this bundle.
Sample API
The
hello-paris
bundle is a pure API, which means it contains only Java interfaces. In this example, there is a single interface, HelloParis
, which returns a localized greeting and a Clock
object that tells the local time. The HelloParis
interface is defined as follows:
// Java package org.fusesource.example.hello.paris; import org.fusesource.example.time.Clock; public interface HelloParis { public String getGreeting(); public Clock getLocalTime(); }
Maven dependencies
In the Maven POM file, the
hello-paris
bundle defines dependencies on the following Maven artifact:
time-util
Import and export rules
The following import and export rules apply to the
hello-paris
bundle:
- Exporting own packages—the
org.fusesource.example.hello.paris
package is public, and must be exported. - Importing own packages—none of the bundle's own packages should be imported.
- Importing dependent packages—any external package dependencies must be imported.
Maven bundle plug-in settings
The Maven bundle plug-in is configured to export the API package,
org.fusesource.example.hello.paris
(coded as ${project.groupId}.hello.paris*
). The Export-Package
instruction also contains entries to block the export of any packages containing .impl
or .internal
. In this case, the bundle plug-in instructions are as follows:
<instructions> <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName> <Import-Package>*</Import-Package> <Export-Package> !${project.groupId}*.impl*, !${project.groupId}*.internal*, ${project.groupId}.hello.paris*;version=${project.version} </Export-Package> </instructions>
Generated MANIFEST.MF file
When you build the bundle using Maven, the Maven bundle plug-in automatically generates the following
MANIFEST.MF
file:
Manifest-Version: 1.0 Bundle-Name: hello-paris Built-By: JBLOGGS Build-Jdk: 1.5.0_08 Created-By: Apache Maven Bundle Plugin Import-Package: org.fusesource.example.time;version="[1.0,2)" Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.fusesource.example.hello-paris Tool: Bnd-1.15.0 Bnd-LastModified: 1296826928285 Export-Package: org.fusesource.example.hello.paris;uses:="org.fusesour ce.example.time";version="1.0" Bundle-Version: 1.0.0
The
Import-Package
header lists one external package dependency, org.fusesource.example.time
. None of the bundle's own packages are imported.
The
Export-Package
header is used to export the API package, org.fusesource.example.hello.paris
, while the uses
clause declares a transitive dependency on the org.fusesource.example.time
package.