<!--
	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>
	<modelVersion>4.0.0</modelVersion>
	<packaging>bundle</packaging>
	<name>iPOJO Composite (Service Instance) Test Suite</name>
	<artifactId>tests.composite.service.instance</artifactId>
	<groupId>ipojo.tests</groupId>
	<version>1.5.0-SNAPSHOT</version>
	<dependencies>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo</artifactId>
			<version>${pom.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo.composite</artifactId>
			<version>${pom.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo.metadata</artifactId>
			<version>${pom.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.osgi.core</artifactId>
			<version>1.0.1</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>
			<version>1.1.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>ipojo.tests</groupId>
			<artifactId>tests.composite</artifactId>
			<version>${pom.version}</version>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<version>1.4.3</version>
				<extensions>true</extensions>
				<configuration>
					<instructions>
						<Bundle-SymbolicName>
							${pom.artifactId}
						</Bundle-SymbolicName>
						<Private-Package>
							org.apache.felix.ipojo.test.composite.instantiator*, org.apache.felix.ipojo.test.composite.instance, org.apache.felix.ipojo.test.instance
						</Private-Package>
						<Export-Package>org.apache.felix.ipojo.test.instance.service</Export-Package>
						<Test-Suite>
							org.apache.felix.ipojo.test.composite.instantiator.InstantiatorTestSuite
						</Test-Suite>
					</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>
							<ignoreAnnotations>true</ignoreAnnotations>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>
