• Intro Headers Instructions Macros Commands
  • Fork me on GitHub
    • Introduction
    • How to install bnd
    • Guided Tour
    • Guided Tour Workspace & Projects
    • Concepts
    • Best practices
    • Build
    • Project Setup
    • Generating JARs
    • Versioning
    • Baselining
    • Service Components
    • Metatype
    • Contracts
    • Bundle Annotations
    • Accessor Properties
    • SPI Annotations
    • Resolving Dependencies
    • Launching
    • Startlevels
    • Testing
    • Testing with Launchpad
    • Packaging Applications
    • JPMS Libraries
    • Wrapping Libraries to OSGi Bundles
    • Generating Documentation
    • Commands
    • For Developers
    • Tips for Windows users
    • Tools bound to bnd
    • Headers
    • Instruction Reference
    • Instruction Index
    • Macro Reference
    • Macro Index
    • Plugins
    • External Plugins
    • Settings
    • Errors
    • Warnings
    • Frequently Asked Questions


  • Quick Start

    Assume we need to create a bundle in Eclipse. Each Java project in Eclipse has a set of sources and a class path. bnd therefore knows, about all the classes. However, it does not know how you want to structure your JARs/Bundles. It therefore needs a description file, the ‘‘bnd file’’. If you create such a file, you should give it the same as name as the bundle symbolic name with a .bnd extension. For example aQute.example.bnd is a well chosen name. If the name is not bnd.bnd, the file name without the .bnd extension is the default for your bundle symbolic name.

    Lets build a bundle for the aQute OSGi tutorial Chat example. This bundle has 2 packages.

    • aQute.service.channel
    • aQute.tutorial.chat

    The aQute.service.channel package must be exported and the other package may remain private. All packages that are referred from the source code must be imported. To achieve this, the following manifest will suffice:

    Export-Package: aQute.service.channel; version=1.0 
    Private-Package: aQute.tutorial.chat
    

    This is all you need! In Eclipse, you can select the bnd file and run the Make Bundle command. This will create a JAR with the proper content:

    META-INF 
      MANIFEST.MF 
    aQute/service/channel 
      Channel.class 
      aQute/tutorial/chat 
      Chat$ChannelTracker.class 
      Chat.class
    

    You can run the same command from the command line

    $ bnd aQute.tutorial.chat.bnd
    

    Now take a look at the JAR file’s manifest. With the command line version of you can do this with bnd aQute.tutorial.chat.jar. Otherwise just open the JAR with WinZip.

    Manifest-Version: 1 Bundle-Name: aQute.tutorial.chat Private-Package: aQute.tutorial.chat Import-Package: aQute.service.channel;version=1.0, org.osgi.framework; version=1.3, org.osgi.util.tracker;version=1.3 Bundle-ManifestVersion: 2 Bundle-SymbolicName: aQute.tutorial.chat Export-Package: aQute.service.channel;version=1.0 Bundle-Version: 0

    As you can see, bnd filled in a number of headers. The first header, Manifest-Version is required by the JAR standard. Bundle-Name is derived from the Bundle-SymbolicName because we did not specify it. The Private-Package header specifies the packages that ended up not exported. The Import-Package header comes from the packages that were referred to from the contained packages (private and exported). As you can see, bnd picked up versions for the imported packages. These versions come from the manifest of the JARs that source these packages, or from the packageinfo file. The Export-Package shows the export of the service package. On top of this, bnd has verified that all your headers really match the OSGi specifications, or you will get errors and warnings.

    • GitHub