<!--
 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-parent</artifactId>
   <groupId>org.apache.felix</groupId>
   <version>1.2.1</version>
   <relativePath>../pom/pom.xml</relativePath>
 </parent>

 <modelVersion>4.0.0</modelVersion>

 <artifactId>maven-bundle-plugin</artifactId>
 <version>2.1.0</version>
 <packaging>maven-plugin</packaging>
 
 <name>Maven Bundle Plugin</name>
 <description>
  Provides a maven plugin that supports creating an OSGi bundle
  from the contents of the compilation classpath along with its
  resources and dependencies. Plus a zillion other features.
  The plugin uses the Bnd tool (http://www.aqute.biz/Code/Bnd)
 </description>

 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
     <source>1.5</source>
     <target>1.5</target>
    </configuration>
   </plugin>
  </plugins>
 </build>
 
 <dependencies>
  <dependency>
    <groupId>biz.aQute</groupId>
    <artifactId>bndlib</artifactId>
    <version>0.0.357</version>
  </dependency>
  <dependency>
    <groupId>net.sf.kxml</groupId>
    <artifactId>kxml2</artifactId>
    <version>2.2.2</version>
  </dependency>
  <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.apache.felix.bundlerepository</artifactId>
      <version>1.6.2</version>
  </dependency>
  <dependency>
    <groupId>org.apache.felix</groupId>
    <artifactId>org.osgi.core</artifactId>
    <version>1.0.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.felix</groupId>
    <artifactId>org.osgi.service.obr</artifactId>
    <version>1.0.1</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</groupId>
   <artifactId>maven-archiver</artifactId>
   <version>2.2</version>
  </dependency>
  <dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-artifact-manager</artifactId>
    <version>2.0.7</version>
  </dependency>
  <dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-settings</artifactId>
    <version>2.0.7</version>
  </dependency>
  <dependency>
   <groupId>org.apache.maven.shared</groupId>
   <artifactId>maven-dependency-tree</artifactId>
   <version>1.2</version>
  </dependency>
  <dependency>
    <groupId>org.apache.maven.wagon</groupId>
    <artifactId>wagon-provider-api</artifactId>
    <version>1.0-beta-2</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.codehaus.plexus</groupId>
   <artifactId>plexus-archiver</artifactId>
   <version>1.0-alpha-7</version>
  </dependency>
  <dependency>
   <groupId>org.codehaus.plexus</groupId>
   <artifactId>plexus-utils</artifactId>
   <version>1.4.7</version>
  </dependency>
  <dependency>
   <groupId>org.apache.maven.shared</groupId>
   <artifactId>maven-plugin-testing-harness</artifactId>
   <version>1.1</version>
   <scope>test</scope>
  </dependency>
 </dependencies>

  <scm>
    <connection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/maven-bundle-plugin-2.1.0</connection>
    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/maven-bundle-plugin-2.1.0</developerConnection>
    <url>scm:svn:https://svn.apache.org/repos/asf/felix/releases/maven-bundle-plugin-2.1.0</url>
  </scm>
</project>
