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.
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.
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();
}In the Maven POM file, the hello-paris bundle defines
dependencies on the following Maven artifact:
time-util
The following import and export rules apply to the hello-paris
bundle:
Exporting own packages—the
org.fusesource.example.hello.parispackage 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.
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>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.








