<!--
 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>
  </dependency>
  <dependency>
   <groupId>biz.aQute</groupId>
   <artifactId>bndlib</artifactId>
   <version>0.0.212</version>
  </dependency>
  <dependency>
   <groupId>org.apache.maven</groupId>
   <artifactId>maven-project</artifactId>
   <version>2.0.7</version>
  </dependency>
  <dependency>
   <groupId>org.apache.maven</groupId>
   <artifactId>maven-model</artifactId>
   <version>2.0.7</version>
  </dependency>
  <dependency>
   <groupId>org.apache.maven</groupId>
   <artifactId>maven-plugin-api</artifactId>
   <version>2.0.7</version>
  </dependency>
  <dependency>
   <groupId>org.apache.maven</groupId>
   <artifactId>maven-artifact</artifactId>
   <version>2.0.7</version>
  </dependency>
  <dependency>
   <groupId>org.apache.maven.shared</groupId>
   <artifactId>maven-dependency-tree</artifactId>
   <version>1.1-SNAPSHOT</version>
  </dependency>
  <dependency>
   <groupId>org.apache.maven.shared</groupId>
   <artifactId>maven-osgi</artifactId>
   <version>0.2.0-SNAPSHOT</version>
  </dependency>
  <dependency>
   <groupId>org.codehaus.plexus</groupId>
   <artifactId>plexus-container-default</artifactId>
   <version>1.0-alpha-9-stable-1</version>
  </dependency>
  <dependency>
   <groupId>org.apache.maven.shared</groupId>
   <artifactId>maven-plugin-testing-harness</artifactId>
   <version>1.1</version>
   <scope>test</scope>
  </dependency>
 </dependencies>

</project>
