<!--
	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-parent</artifactId>
		<version>1.2.0</version>
		<relativePath>../../pom/pom.xml</relativePath>
	</parent>
	<modelVersion>4.0.0</modelVersion>
	<packaging>bundle</packaging>
	<artifactId>org.apache.felix.ipojo.api</artifactId>
	<version>1.3.0-SNAPSHOT</version>
	<name>Apache Felix iPOJO API</name>
	<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>
						<Import-Package>
							!org.objectweb.asm.tree, 
							org.apache.felix.ipojo.composite;resolution:=optional,
							*
						</Import-Package>
						<Export-Package>
							org.apache.felix.ipojo.api,
							org.apache.felix.ipojo.api.composite,
							org.apache.felix.ipojo.manipulation,
							org.apache.felix.ipojo.manipulation.annotations,
							org.objectweb.asm.commons, org.objectweb.asm
						</Export-Package>
						<Include-Resource> META-INF/LICENCE=LICENSE,
							META-INF/NOTICE=NOTICE, META-INF/LICENSE.asm=LICENSE.asm
						</Include-Resource>
						
					</instructions>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>rat-maven-plugin</artifactId>
				<configuration>
					<excludeSubProjects>false</excludeSubProjects>
					<useEclipseDefaultExcludes>true</useEclipseDefaultExcludes>
					<useMavenDefaultExcludes>true</useMavenDefaultExcludes>
					<excludes>
						<param>doc/**/*</param>
						<param>maven-eclipse.xml</param>
						<param>.checkstyle</param>
						<param>.externalToolBuilders/*</param>
						<param>LICENSE.asm</param>
						<param>.fbprefs</param>
					</excludes>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-checkstyle-plugin</artifactId>
				<configuration>
					<enableRulesSummary>false</enableRulesSummary>
					<violationSeverity>warning</violationSeverity>
					<configLocation>http://felix.apache.org/ipojo/dev/checkstyle_ipojo.xml</configLocation>
				</configuration>
			</plugin>
			
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo</artifactId>
			<version>1.3.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo.composite</artifactId>
			<version>1.3.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo.manipulator</artifactId>
			<version>1.3.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>asm</groupId>
			<artifactId>asm-all</artifactId>
			<version>3.0</version>
			<exclusions>
				<exclusion>
					<groupId>asm</groupId>
					<artifactId>asm-tree</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>
</project>
