This section explains how to set up a Maven project for a typical library bundle.
The time-util bundle exemplifies a library bundle, where the main
purpose of a library is to make interfaces and classes available to other bundles.
Hence, the library should export all of its own packages and associate a version
number with the exported packages.
Assuming it is built as a Maven project, the time-util bundle has
the following directory structure:
time-util/
|
\--src/
|
\--main/
| |
| \--java/
| |
| \--org/fusesource/example/time/
| |
| \-TimeUtil.java
| |
| \-Clock.java
|
\--test/The Java source code is located under the src/main/java
sub-directory. The org.fusesource.example.time 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 time-util bundle is essentially a wrapper around some of the
standard time utilities in Java. It provides a Clock class, which
returns the local time in a particular time zone when you invoke the
Clock.getLocalTime() method. The Clock class is
defined as follows:
// Java
package org.fusesource.example.time;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;
public class Clock {
...
public Clock(TimeUtil.TimeZone tz) {
...
}
public String getLocalTime() {
return jcal.getTime().toString();
}
}The TimeUtil class is a factory that is used to create
Clock instances for particular time zones. Two time zones are
supported: TimeZone.BOSTON and TimeZone.PARIS. The
TimeUtil class is defined as follows:
// Java
package org.fusesource.example.time;
public class TimeUtil {
public enum TimeZone {
BOSTON,
PARIS
}
public static Clock createClock(TimeZone tz) {
return new Clock(tz);
}
}The following import and export rules apply to the time-util
bundle:
Exporting own packages—the
org.fusesource.example.timepackage is public, and must be exported.Importing own packages—none of the bundle's own packages should be imported, which is the usual case for a library bundle.
Importing dependent packages—any external package dependencies must be imported. In this particular example, however, there are none (the
time-utilbundle depends only on classes from the JVM).
The Maven bundle plug-in is configured to export the library package,
org.fusesource.example.time (coded as
${project.groupId}.time). 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}.time*;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: time-util Built-By: JBLOGGS Build-Jdk: 1.5.0_08 Created-By: Apache Maven Bundle Plugin Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.fusesource.example.time-util Tool: Bnd-1.15.0 Bnd-LastModified: 1297357076457 Export-Package: org.fusesource.example.time;version="1.0" Bundle-Version: 1.0.0








