<!--
	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/xsd/maven-4.0.0.xsd">
	<parent>
		<groupId>org.apache.felix</groupId>
		<artifactId>felix</artifactId>
		<version>1.0.2</version>
		<relativePath>../../pom/pom.xml</relativePath>
	</parent>
	<modelVersion>4.0.0</modelVersion>
	<artifactId>org.apache.felix.ipojo.ant</artifactId>
	<groupId>org.apache.felix</groupId>
	<version>0.7.6-SNAPSHOT</version>
	<packaging>bundle</packaging>
	<name>Apache Felix iPOJO Ant Task</name>
	<dependencies>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo.metadata</artifactId>
			<version>0.7.6-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo.manipulator</artifactId>
			<version>0.7.6-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>xerces</groupId>
			<artifactId>xercesImpl</artifactId>
			<version>2.4.0</version>
		</dependency>
		<dependency>
			<groupId>ant</groupId>
			<artifactId>ant</artifactId>
			<version>1.6.5</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<version>1.4.0</version>
				<extensions>true</extensions>
				<configuration>
					<instructions>
						<Bundle-Name>iPOJO Ant Task</Bundle-Name>
                        <Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
						<Bundle-Description>
							iPOJO Ant Task
						</Bundle-Description>
						<Private-Package>
							org.apache.felix.ipojo.metadata,
							org.apache.felix.ipojo.manipulator,
							org.apache.felix.ipojo.xml.parser,
							org.apache.felix.ipojo.manipulation*,
							org.objectweb.asm.util;-split-package:=merge-first,
							org.objectweb.asm;-split-package:=merge-first,
							org.objectweb.asm.commons;-split-package:=merge-first,
							org.apache.xerces.parsers,
							org.apache.xerces.xni*,
							org.apache.xerces.impl*,
							org.apache.xerces.util.*
						</Private-Package>
						<Export-Package>
							org.apache.felix.ipojo.task
						</Export-Package>
					</instructions>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>