<!--
	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>1.0.0</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>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo.manipulator</artifactId>
			<version>1.0.0</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.2</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.*,
							org.apache.xerces.dom.*,
							org.apache.xerces.dom3.*
						</Private-Package>
						<Export-Package>
							org.apache.felix.ipojo.task
						</Export-Package>
						<Include-Resource>
							META-INF/LICENCE=LICENSE,
							META-INF/NOTICE=NOTICE,
							META-INF/LICENSE.asm=LICENSE.asm
						</Include-Resource>
					</instructions>
				</configuration>
			</plugin>
		</plugins>
	</build>

  <scm>
    <connection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.ipojo.ant-1.0.0</connection>
    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.ipojo.ant-1.0.0</developerConnection>
    <url>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.ipojo.ant-1.0.0</url>
  </scm>
</project>