<!--
 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>felix</artifactId>
		<version>2</version>
		<relativePath>../pom/pom.xml</relativePath>
	</parent>

	<name>Apache Felix Lightweight HTTP Service Reactor</name>
	<artifactId>org.apache.felix.httplite.reactor</artifactId>
	<version>1-SNAPSHOT</version>
	<packaging>pom</packaging>
	
	<build>
		<plugins>
			<plugin>
		        <groupId>org.codehaus.mojo</groupId>
		        <artifactId>animal-sniffer-maven-plugin</artifactId>
		        <version>1.7</version>
		        <configuration>
		            <signature>
		                <groupId>org.codehaus.mojo.signature</groupId>
		                <artifactId>java13-sun</artifactId>
		                <version>1.0</version>
		            </signature>
		        </configuration>
		        <executions>
		            <execution>
		                <phase>test</phase>
		                <goals>
		                    <goal>check</goal>
		                </goals>
		            </execution>
		        </executions>
		    </plugin>
	    </plugins>
    </build>

	<modules>
		<module>minimum</module>
		<module>complete</module>
	</modules>
</project>
