<!--
 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>
  <parent>
    <groupId>org.apache.felix</groupId>
    <artifactId>felix</artifactId>
    <version>0.9.0-incubator-SNAPSHOT</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>
  <packaging>bundle</packaging>
  <dependencies>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>org.osgi.core</artifactId>
      <version>${pom.version}</version>
    </dependency>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>javax.servlet</artifactId>
      <version>${pom.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.osgi.foundation</artifactId>
      <version>${pom.version}</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <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>
</project>
