<!--
	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>
	<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>
	<packaging>bundle</packaging>
	<name>Apache Felix iPOJO Composite</name>
	<artifactId>org.apache.felix.ipojo.composite</artifactId>
	<groupId>org.apache.felix</groupId>
	<version>0.7.6-SNAPSHOT</version>
	<dependencies>
		<dependency>
			<groupId>${pom.groupId}</groupId>
			<artifactId>org.osgi.core</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>${pom.groupId}</groupId>
			<artifactId>org.osgi.compendium</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>${pom.groupId}</groupId>
			<artifactId>org.apache.felix.ipojo.metadata</artifactId>
			<version>${pom.version}</version>
		</dependency>
		<dependency>
			<groupId>${pom.groupId}</groupId>
			<artifactId>org.apache.felix.ipojo.manipulator</artifactId>
			<version>${pom.version}</version>
		</dependency>
		<dependency>
			<groupId>${pom.groupId}</groupId>
			<artifactId>org.apache.felix.ipojo</artifactId>
			<version>${pom.version}</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 Composite</Bundle-Name>
						<Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
						<Bundle-Description>
							iPOJO Composititon Framework
						</Bundle-Description>
						<Import-Package>
							org.apache.felix.ipojo,
							org.apache.felix.ipojo.architecture,
							org.apache.felix.ipojo.context,
							org.apache.felix.ipojo.metadata,
							org.apache.felix.ipojo.parser,
							org.apache.felix.ipojo.util,
							org.osgi.framework
						</Import-Package>
						<Private-Package>
							org.apache.felix.ipojo.manipulation,
							org.apache.felix.ipojo.composite.architecture,
							org.apache.felix.ipojo.composite.service*,
							org.apache.felix.ipojo.composite.instance,
							org.apache.felix.ipojo.composite.util,
							!org.objectweb.asm.xml*,
							org.objectweb.asm*;-split-package:=merge-first
						</Private-Package>
						<Export-Package>
							org.apache.felix.ipojo.composite;
							version="0.7.6"
						</Export-Package>
						<IPOJO-Extension>
							composite:org.apache.felix.ipojo.composite.CompositeFactory
						</IPOJO-Extension>
						<_donotcopy>
							(CVS|.svn|.+.bak|~.+|metadata.xml)
						</_donotcopy>
					</instructions>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-ipojo-plugin</artifactId>
				<version>${pom.version}</version>
				<executions>
					<execution>
						<goals>
							<goal>ipojo-bundle</goal>
						</goals>
						<configuration>
							<metadata>metadata.xml</metadata>
							<ignoreAnnotations>true</ignoreAnnotations>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>
