<?xml version="1.0" encoding="UTF-8"?>
<!--
 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.aries.blueprint</groupId>
        <artifactId>blueprint-parent</artifactId>
        <version>1.0.0</version>
        <relativePath>../blueprint-parent/pom.xml</relativePath>
    </parent>

    <groupId>org.apache.aries.blueprint</groupId>
    <artifactId>org.apache.aries.blueprint.webosgi</artifactId>
    <packaging>bundle</packaging>
    <version>1.0.2-SNAPSHOT</version>
    <name>Apache Aries Blueprint Web OSGI</name>
    <description>
        This bundle contains an OSGI-aware Servlet ContextListener for bootstrapping
        blueprint inside web-bundle containers.
    </description>

    <scm>
        <connection>scm:git:https://gitbox.apache.org/repos/asf/aries.git</connection>
        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/aries.git</developerConnection>
        <url>https://gitbox.apache.org/repos/asf?p=aries.git;a=summary</url>
    </scm>

    <properties>
        <aries.osgi.export.pkg>
            org.apache.aries.blueprint.web
        </aries.osgi.export.pkg>
        <aries.osgi.import.pkg>
           org.osgi.framework,
           org.osgi.service.blueprint.container;provide:=true,
           org.apache.aries.blueprint.services;provide:=true;version="[1.2,2.0)",
           javax.servlet*;version="[0.0,4)"
        </aries.osgi.import.pkg>
        <blueprint.core.version>1.3.0</blueprint.core.version>
    </properties>

    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <blueprint.api.version>${blueprint.api.dev.version}</blueprint.api.version>
                <blueprint.core.version>${blueprint.core.dev.version}</blueprint.core.version>
                <blueprint.cm.version>${blueprint.cm.dev.version}</blueprint.cm.version>
                <blueprint.parser.version>${blueprint.parser.dev.version}</blueprint.parser.version>
                <blueprint.authz.version>${blueprint.authz.dev.version}</blueprint.authz.version>
                <blueprint.spring.version>${blueprint.spring.dev.version}</blueprint.spring.version>
                <blueprint.spring.extender.version>${blueprint.spring.extender.dev.version}</blueprint.spring.extender.version>
                <blueprint.jexl.evaluator.version>${blueprint.jexl.evaluator.dev.version}</blueprint.jexl.evaluator.version>
                <blueprint.sample.version>${blueprint.sample.dev.version}</blueprint.sample.version>
                <blueprint.sample.fragment.version>${blueprint.sample.fragment.dev.version}</blueprint.sample.fragment.version>
            </properties>
        </profile>
    </profiles>

    <dependencies>
        <dependency>
            <groupId>org.apache.aries.blueprint</groupId>
            <artifactId>org.apache.aries.blueprint.core</artifactId>
            <version>${blueprint.core.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-servlet_2.5_spec</artifactId>
            <version>1.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    <build>
	    <pluginManagement>
	        <plugins>
	            <plugin>
	                <groupId>org.apache.maven.plugins</groupId>
	                <artifactId>maven-release-plugin</artifactId>
	                <configuration>
	                    <mavenExecutorId>forked-path</mavenExecutorId>
	                </configuration>
	            </plugin>
	        </plugins>
	    </pluginManagement>
    </build>

</project>
