<?xml version="1.0" encoding="UTF-8"?>
<!--
 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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.apache.felix</groupId>
        <artifactId>felix-parent</artifactId>
        <version>2.1</version>
        <relativePath>../../pom/pom.xml</relativePath>
    </parent>
    <properties>
        <osgi.version>4.2.0</osgi.version>
    </properties>
    <name>Apache Felix Dependency Manager</name>
    <artifactId>org.apache.felix.dependencymanager</artifactId>
    <version>3.1.1-SNAPSHOT</version>
    <packaging>bundle</packaging>

    <scm>
      <connection>scm:svn:file:///home/nxuser/work/maven/repos/trunk/dependencymanager/core</connection>
      <developerConnection>scm:svn:file:///home/nxuser/work/maven/repos/trunk/dependencymanager/core</developerConnection>
      <url>file:///home/nxuser/work/maven/repos/trunk/dependencymanager/core</url>
    </scm>  

    <dependencies>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>${osgi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <version>${osgi.version}</version>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>.</directory>
                <targetPath>META-INF</targetPath>
                <includes>
                    <include>LICENSE*</include>
                    <include>NOTICE*</include>
                    <include>DEPENDENCIES*</include>
                    <include>*.txt</include>
                </includes>
            </resource>
        </resources>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>maven-bundle-plugin</artifactId>
                    <version>2.3.4</version>
                    <extensions>true</extensions>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <!-- by default the dependency manager will run on any OSGi execution environment -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <target>1.3</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>org.apache.felix.dependencymanager</Bundle-SymbolicName>
                        <Bundle-Name>Apache Felix Dependency Manager</Bundle-Name>
                        <Bundle-Description>Provides dynamic service and component dependency management.</Bundle-Description>
                        <Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
                        <Export-Package>org.apache.felix.dm;version="3.0.0";provide:=true,org.apache.felix.dm.tracker;version="3.1.0";provide:=true</Export-Package>
                        <Import-Package>*</Import-Package>
                        <Private-Package>org.apache.felix.dm.impl, org.apache.felix.dm.impl.*</Private-Package>
                        <!-- Uncomment this next line to include source code in the bundle.
                        <Include-Resource>src/main/java</Include-Resource>
                        -->
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
