 ------
 Introduction
 ------
 Stuart McCulloch
 ------
 2011-06-28
 ------

 ~~ Licensed to the Apache Software Foundation (ASF) under one
 ~~ or more contributor license agreements.  See the NOTICE file
 ~~ distributed with this work for additional information
 ~~ regarding copyright ownership.  The ASF licenses this file
 ~~ to you under the Apache License, Version 2.0 (the
 ~~ "License"); you may not use this file except in compliance
 ~~ with the License.  You may obtain a copy of the License at
 ~~
 ~~   http://www.apache.org/licenses/LICENSE-2.0
 ~~
 ~~ Unless required by applicable law or agreed to in writing,
 ~~ software distributed under the License is distributed on an
 ~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 ~~ KIND, either express or implied.  See the License for the
 ~~ specific language governing permissions and limitations
 ~~ under the License.

 ~~ NOTE: For help with the syntax of this file, see:
 ~~ http://maven.apache.org/doxia/references/apt-format.html

Maven Bundle Plugin

  This Maven 2 plugin is based on the {{{http://www.aqute.biz/Bnd/Bnd/}BND}} tool from Peter Kriens. The way BND works is by treating your project as a big collection of classes (e.g., project code, dependencies, and the class path). The way you create a bundle with BND is to tell it the content of the bundle's JAR file as a subset of the available classes. This plugin wraps BND to make it work specifically with the Maven 2 project structure and to provide it with reasonable default behavior for Maven 2 projects.

* Goals Overview

  General Information about the goals.

  * {{{./bundle-mojo.html}bundle:bundle}} Create an OSGi bundle from Maven project. (life-cycle goal)

  * {{{./manifest-mojo.html}bundle:manifest}} Generate an OSGi manifest for this project.

  * {{{./cleanVersions-mojo.html}bundle:cleanVersions}} Convert a group of versions to OSGi format.

  * {{{./instructions-mojo.html}bundle:instructions}} Generate BND instructions for this project.

  * {{{./install-mojo.html}bundle:install}} Installs bundle details in the local OBR repository. (life-cycle goal)

  * {{{./deploy-mojo.html}bundle:deploy}} Deploys bundle details to a remote OBR repository. (life-cycle goal)

  * {{{./index-mojo.html}bundle:index}} Index the content of a maven repository using OBR.

  * {{{./install-file-mojo.html}bundle:install-file}} Installs bundle details in the local OBR repository. (command-line goal)

  * {{{./deploy-file-mojo.html}bundle:deploy-file}} Deploys bundle details to a remote OBR repository. (command-line goal)

  * {{{./clean-mojo.html}bundle:clean}} Clean a local OBR repository by finding and removing missing resources.

  * {{{./remote-clean-mojo.html}bundle:remote-clean}} Clean a remote OBR repository by finding and removing missing resources.

  * {{{./ant-mojo.html}bundle:ant}} Generate Ant script to create the bundle. (you should run ant:ant first)

  []

* Usage

  General instructions on how to use the Maven Bundle Plugin can be found on the
  {{{http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html}wiki page}}.
  Some more specific use cases are described in the examples given below.

  In case you still have questions regarding the plugin's usage, please have a look at the
  {{{http://felix.apache.org/site/apache-felix-bundle-plugin-faq.html}FAQ}} and feel
  free to contact the {{{http://felix.apache.org/site/mailinglists.html}user mailing list}}.
  The posts to the mailing list are archived and could
  already contain the answer to your question as part of an older thread. Hence, it is also worth browsing/searching
  the {{{http://www.mail-archive.com/users@felix.apache.org/}mail archive}}.

  If you feel like the plugin is missing a feature or has a defect, you can fill a feature request or bug report in our
  {{{./issue-tracking.html}issue tracker}}. When creating a new issue, please provide a comprehensive description of your
  concern. Especially for fixing bugs it is crucial that the developers can reproduce your problem. For this reason,
  entire debug logs, POMs or most preferably little demo projects attached to the issue are very much appreciated.
  Of course, patches are welcome, too. Contributors can check out the project from our
  {{{./source-repository.html}source repository}} and will find supplementary information in the
  {{{http://felix.apache.org/site/development.html}Apache Felix developers guide}}. 

* Examples

  To provide you with better understanding on some usages of the Maven Bundle Plugin,
  you can take a look into the following examples:

  * Examples coming soon!

