<!--
 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">
	<parent>
		<groupId>org.apache.felix</groupId>
		<artifactId>felix-parent</artifactId>
		<version>2.1</version>
		<relativePath>../../pom/pom.xml</relativePath>
	</parent>
	<modelVersion>4.0.0</modelVersion>
	<packaging>bundle</packaging>
	<name>Apache Felix Lightweight HTTP Service Core</name>
	<description>A minimal HTTP Service implementation.</description>
	<version>0.1.4</version>
	<artifactId>org.apache.felix.httplite.core</artifactId>
	<dependencies>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.core</artifactId>
			<version>4.2.0</version>
		</dependency>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.compendium</artifactId>
			<version>4.2.0</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.4</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.googlecode.pojosr</groupId>
			<artifactId>de.kalpatec.pojosr.framework</artifactId>
			<version>0.1.6</version>
			<type>bundle</type>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<build>
		<resources>
			<resource>
				<directory>${project.basedir}</directory>
				<targetPath>META-INF</targetPath>
				<includes>
					<include>LICENSE</include>
					<include>NOTICE</include>
					<include>DEPENDENCIES</include>
				</includes>
			</resource>
		</resources>
		<plugins>			
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.3</source>
					<target>1.3</target>
				</configuration>
			</plugin>
			<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>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<version>2.3.4</version>
				<extensions>true</extensions>
				<configuration>
					<instructions>
						<Export-Package />
						<Private-Package>org.apache.felix.httplite.osgi,
							org.apache.felix.httplite.server,
							org.apache.felix.httplite.servlet
						</Private-Package>
						<Export-Service>org.osgi.service.http.HttpService</Export-Service>
						<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
						<Bundle-Activator>${project.artifactId}.osgi.Activator</Bundle-Activator>
						<Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
						<Import-Package>
							javax.servlet;version="2.4",
							javax.servlet.http;version="2.4",
							org.osgi.service.http;version="1.2",
							*
						</Import-Package>
						<Import-Service>
							org.osgi.service.log.LogService;availability:=optional;multiple:=false
						</Import-Service>
						<Bundle-DocURL>http://felix.apache.org/site/apache-felix-light-http-service.html</Bundle-DocURL>
					</instructions>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<scm>
		<connection>scm:svn:http://svn.apache.org/repos/asf/felix/releases/org.apache.felix.httplite.core-0.1.4</connection>
		<developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.httplite.core-0.1.4</developerConnection>
		<url>http://svn.apache.org/repos/asf/felix/releases/org.apache.felix.httplite.core-0.1.4</url>
	</scm>
	<url>http://felix.apache.org/site/apache-felix-lightweight-http-service.html</url>
</project>
