- Create an OSGi bundle that exports classes and interfaces
 
- What is an OSGi bundle
 - How to create an OSGi bundle using maven-bundle-plugin
 - How to install an OSGi bundle
 - How to expose classes and interfaces so other bundles can use it
 - Learn to use Export-Package in MANIFEST.MF
 
This code is primarily tested on JBoss Fuse. ServiceMix and Karaf 3 and 4 are also supported.
An OSGi bundle is just a JAR file with custom entries in the META-INF/MANIFEST.MF file.
For this example, we want to make the Java interface com.jirawat.osgi.api.Echo and Java class com.jirawat.osgi.exception.EchoException public so that it can be reused. The end result is a JAR file with Echo and EchoException in it, just like you would normally package any Java classes in a JAR file. The OSGi difference is that this JAR file contains an entry in META-INF/MANIFEST.MF called Export-Package. As the name suggests, the Export-Package entry tells OSGi that classes in this Java package are public.
Step 1: Configure maven-bundle-plugin to export public packages
Configure maven-bundle-plugin to specify which Java package to make public by adding it to the Export-Package entries.
Step 2: Configure pom.xml for bundle packaging
Set maven-bundle-plugin extensions to true. Then add bundle as the packaging option
The pom.xml should look like this
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.jirawat.osgi</groupId>
    <artifactId>api</artifactId>
    <version>1.0.0</version>
    <packaging>bundle</packaging>
    <name>jirawat.com :: tutorial :: ${project.artifactId} Bundle</name>
    <description>Tutorial Bundle for ${project.artifactId}</description>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>3.0.0</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
                        <Export-Package>
                            com.jirawat.osgi.api,
                            com.jirawat.osgi.exception
                        </Export-Package>
                        <Import-Package>*</Import-Package>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
Step 3: Build it
mvn clean package
This produces a JAR file with the Java classes and interfaces and a META-INF/MANIFEST.MF . Notice the Export-Package entry exports the classes in the com.jirawat.osgi.api and com.jirawat.osgi.exception as public and reusable by other bundles. The MANIFEST.MF looks like
Manifest-Version: 1.0 Bnd-LastModified: 1443617839644 Build-Jdk: 1.7.0_45 Built-By: juttayaya Bundle-Description: Tutorial Bundle for api Bundle-ManifestVersion: 2 Bundle-Name: jirawat.com :: tutorial :: api Bundle Bundle-SymbolicName: com.jirawat.osgi.api Bundle-Version: 1.0.0 Created-By: Apache Maven Bundle Plugin Export-Package: com.jirawat.osgi.api;version="1.0.0",com.jirawat.osgi.exception;version="1.0.0" Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.5))" Tool: Bnd-3.0.0.201509101326
Step 4: Install it
Put the JAR file from step 3 in any directory and use the osgi:install JBoss Fuse command to install it
For example:
osgi:install -s file:/usr/local/osgi/api-1.0.0.jar
Note for ServiceMix and Karaf 3 and 4, use the bundle:install command
bundle:install -s file:/usr/local/osgi/api-1.0.0.jar
The osgi:list command shows the bundle installed. (bundle:list for ServiceMix and Karaf)
osgi:list
[ 268] [Active ] [ ] [ ] [ 80] jirawat.com :: tutorial :: api Bundle (1.0.0)