<!--
 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.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>
