<!--
 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.
-->
<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/maven-v4_0_0.xsd">
 
 <parent>
   <artifactId>felix</artifactId>
   <groupId>org.apache.felix</groupId>
   <version>1.1.0-SNAPSHOT</version>
   <relativePath>../pom/pom.xml</relativePath>
 </parent>

 <modelVersion>4.0.0</modelVersion>

 <artifactId>maven-bundle-plugin</artifactId>
 <version>1.1.0-SNAPSHOT</version>
 <packaging>maven-plugin</packaging>
 
 <name>Maven Bundle Plugin</name>
 <description>
  Provides a maven plugin which allows the creation of an OSGi bundle by
  embedding used packages as class or jars by inspecting the classpath used to
  compile the bundle. Plus a zillion other features. 
  The plugin relies on the bnd tools, so to gather more information you can look
  at is documentation http://www.aqute.biz/php/tools/bnd.php
 </description>
 
 <dependencies>
<!--
  <dependency>
   <groupId>org.apache.felix</groupId>
   <artifactId>maven-obr-plugin</artifactId>
   <version>0.1.0-SNAPSHOT</version>
   <scope>runtime</scope>
  </dependency>
-->
  <dependency>
   <groupId>biz.aQute</groupId>
   <artifactId>bndlib</artifactId>
   <version>0.0.189</version>
  </dependency>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
  </dependency>
  <dependency>
   <groupId>org.apache.maven</groupId>
   <artifactId>maven-plugin-api</artifactId>
   <version>2.0.6</version>
  </dependency>
  <dependency>
   <groupId>org.apache.maven</groupId>
   <artifactId>maven-archiver</artifactId>
   <version>2.2</version>
  </dependency>
  <dependency>
   <groupId>org.apache.maven</groupId>
   <artifactId>maven-artifact</artifactId>
   <version>2.0.6</version>
  </dependency>
    <dependency>
      <groupId>org.apache.maven.shared</groupId>
      <artifactId>maven-dependency-tree</artifactId>
      <version>1.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven.shared</groupId>
      <artifactId>maven-plugin-testing-harness</artifactId>
      <version>1.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.maven.shared</groupId>
      <artifactId>maven-osgi</artifactId>
      <version>0.1.0</version>
    </dependency>
 </dependencies>
</project>
