<!--
    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</groupId>
        <artifactId>java5-parent</artifactId>
        <version>0.5</version>
        <relativePath />
    </parent>

    <groupId>org.apache.aries.blueprint</groupId>
    <artifactId>org.apache.aries.blueprint.sample-fragment</artifactId>
    <name>Apache Aries Blueprint Sample Fragment for Testing Annotation</name>
    <version>0.3.2</version>
    <packaging>bundle</packaging>
    <description>
        Example blueprint fragment, mostly used for annotation tests.
    </description>

     <scm>
         <connection>scm:svn:http://svn.apache.org/repos/asf/aries/tags/org.apache.aries.blueprint.sample-fragment-0.3.2</connection>
         <developerConnection>scm:svn:https://svn.apache.org/repos/asf/aries/tags/org.apache.aries.blueprint.sample-fragment-0.3.2</developerConnection>
         <url>http://svn.apache.org/viewvc/aries/tags/org.apache.aries.blueprint.sample-fragment-0.3.2</url>
     </scm>

    <properties>
		<aries.osgi.export>
			org.apache.aries.blueprint.fragment;-noimport:=true
		</aries.osgi.export>
        <aries.osgi.import>
            org.apache.aries.blueprint.annotation;version="$&lt;range;[==,=+)&gt;",
            *
        </aries.osgi.import>
        <aries.osgi.private.pkg />
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.eclipse</groupId>
            <artifactId>osgi</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.aries.blueprint</groupId>
            <artifactId>org.apache.aries.blueprint.api</artifactId>
            <version>0.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.aries.blueprint</groupId>
            <artifactId>org.apache.aries.blueprint.annotation.api</artifactId>
            <version>0.3</version>
        </dependency>
    </dependencies>

	<build>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.felix</groupId>
					<artifactId>maven-bundle-plugin</artifactId>
					<extensions>true</extensions>
					<inherited>true</inherited>
					<configuration>
						<excludeDependencies>${aries.osgi.exclude.dependencies}</excludeDependencies>
						<instructions>
							<Fragment-Host>org.apache.aries.blueprint.sample-annotation</Fragment-Host>
						</instructions>
					</configuration>
				</plugin>

			</plugins>
		</pluginManagement>
	</build>
    

</project>
