<!--
 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>
    <groupId>org.apache.felix</groupId>
    <artifactId>felix</artifactId>
    <version>1.0.4</version>
    <relativePath>../pom/pom.xml</relativePath>
  </parent>
  <organization>
    <name>OSGi Alliance</name>
    <url>http://www.osgi.org/</url>
  </organization>
  <modelVersion>4.0.0</modelVersion>
  <name>OSGi OBR Service API</name>
  <description>OSGi OBR Service API</description>
  <artifactId>org.osgi.service.obr</artifactId>
  <version>1.1.0-SNAPSHOT</version>
  <packaging>bundle</packaging>
  <dependencies>
    <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.osgi.core</artifactId>
      <version>1.0.1</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <version>1.4.0</version>
        <extensions>true</extensions>
        <configuration>
          <instructions>
            <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
            <Export-Package>${pom.artifactId}</Export-Package>
            <Bundle-Version>1</Bundle-Version>
            <Bundle-Copyright>Copyright (c) OSGi Alliance (2000, 2008). All Rights Reserved.</Bundle-Copyright>
            <Bundle-Category>osgi</Bundle-Category>
          </instructions>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
