<!-- 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>org.apache.felix.http.parent</artifactId>
        <version>12</version>
        <relativePath>../parent/pom.xml</relativePath>
    </parent>

    <name>Apache Felix Servlet API</name>
    <description>Provides the Servlet API for use by applications</description>
    <artifactId>org.apache.felix.http.servlet-api</artifactId>
    <version>1.1.3-SNAPSHOT</version>
    <packaging>bundle</packaging>

    <scm>
        <connection>scm:git:https://github.com/apache/felix-dev.git</connection>
        <developerConnection>scm:git:https://github.com/apache/felix-dev.git</developerConnection>
        <url>https://gitbox.apache.org/repos/asf?p=felix-dev.git</url>
    </scm>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Export-Package>
                            javax.servlet;
                            javax.servlet.annotation;
                            javax.servlet.descriptor;
                            javax.servlet.http;
                                version=2.6,
                            javax.servlet;
                            javax.servlet.annotation;
                            javax.servlet.descriptor;
                            javax.servlet.http;
                                version=3.0,
                            javax.servlet;
                            javax.servlet.annotation;
                            javax.servlet.descriptor;
                            javax.servlet.http;
                                version=3.1
                        </Export-Package>
                        <Provide-Capability>
                            osgi.contract;osgi.contract="JavaServlet";version:Version="3.1";
                            uses:="javax.servlet,javax.servlet.http,javax.servlet.descriptor,javax.servlet.annotation"
                        </Provide-Capability>
						<Embed-Dependency>tomcat-servlet-api;inline=true</Embed-Dependency>
                    </instructions>
                    <!-- Skip baselining -->
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-servlet-api</artifactId>
            <version>8.0.9</version>
        </dependency>
    </dependencies>

</project>
