<!--
 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.2</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 R4 Compendium Bundle</name>
  <description>OSGi Service Platform Release 4 Compendium Interfaces and Classes.</description>
  <artifactId>org.osgi.compendium</artifactId>
  <version>1.0.0</version>
  <packaging>bundle</packaging>
  <dependencies>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>org.osgi.core</artifactId>
      <version>1.0.0</version>
    </dependency>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>javax.servlet</artifactId>
      <version>1.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.osgi.foundation</artifactId>
      <version>1.0.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <version>1.2.0</version>
        <extensions>true</extensions>
        <configuration>
          <instructions>
            <Bundle-SymbolicName>org.osgi.compendium</Bundle-SymbolicName>
            <Export-Package>org.osgi.service.cm,org.osgi.service.component,org.osgi.service.device,org.osgi.service.event,org.osgi.service.http,org.osgi.service.io,org.osgi.service.log,org.osgi.service.metatype,org.osgi.service.prefs,org.osgi.service.provisioning,org.osgi.service.upnp,org.osgi.service.useradmin,org.osgi.service.wireadmin,org.osgi.util.measurement,org.osgi.util.position,org.osgi.util.tracker,org.osgi.util.xml</Export-Package>
            <Import-Package>javax.microedition.io;resolution:=optional,org.osgi.framework,!org.osgi.*,*</Import-Package>
            <DynamicImport-Package>*</DynamicImport-Package>
            <Bundle-Version>4</Bundle-Version>
            <Bundle-Copyright>Copyright (c) OSGi Alliance (2000, 2005). All Rights Reserved.</Bundle-Copyright>
            <Bundle-Category>osgi</Bundle-Category>
          </instructions>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <scm>
    <connection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.osgi.compendium-1.0.0</connection>
    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.osgi.compendium-1.0.0</developerConnection>
    <url>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.osgi.compendium-1.0.0</url>
  </scm>
</project>
