<!--
 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.8.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <name>OSGi R4 Core Bundle</name>
  <artifactId>org.osgi.core</artifactId>
  <packaging>osgi-bundle</packaging>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix.plugins</groupId>
        <artifactId>maven-osgi-plugin</artifactId>
        <version>${pom.version}</version>
        <extensions>true</extensions>
        <configuration>
          <osgiManifest>
            <bundleName>osgi.core</bundleName>
            <bundleVendor>OSGi Alliance</bundleVendor>
            <bundleVersion>4</bundleVersion>
            <bundleSymbolicName>osgi.core</bundleSymbolicName>
            <bundleDescription>OSGi Service Platform Release 4 Core Interfaces and Classes.</bundleDescription>
            <bundleCopyright>Copyright (c) OSGi Alliance (2000, 2005). All Rights Reserved.</bundleCopyright>
            <bundleCategory>osgi</bundleCategory>
            <bundleDocUrl>http://www.osgi.org/</bundleDocUrl>
            <exportPackage>org.osgi.framework; specification-version="1.3", org.osgi.service.condpermadmin; specification-version="1.0", org.osgi.service.packageadmin; specification-version="1.2", org.osgi.service.permissionadmin; specification-version="1.2", org.osgi.service.startlevel; specification-version="1.0", org.osgi.service.url; specification-version="1.0"</exportPackage>
            <!--<dynamicImportPackage>*</dynamicImportPackage>-->
          </osgiManifest>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
