<!--
	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/maven-v4_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>
	<packaging>bundle</packaging>
	<name>Apache Felix iPOJO Arch Command</name>
	<artifactId>org.apache.felix.ipojo.arch</artifactId>
	<groupId>org.apache.felix</groupId>
	<version>1.1.0-SNAPSHOT</version>
	<dependencies>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo</artifactId>
			<version>1.1.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.ipojo.metadata</artifactId>
			<version>1.1.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.shell</artifactId>
			<version>1.0.2</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-Name>Apache Felix iPOJO Arch Command</Bundle-Name>
						<Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
						<Bundle-Vendor> The Apache Software Foundation </Bundle-Vendor>
						<Bundle-Description> iPOJO Arch command for Felix 
						</Bundle-Description>
						<Bundle-DocURL>
							http://felix.apache.org/site/architecture-handler.html 
						</Bundle-DocURL>
						<Private-Package> org.apache.felix.ipojo.arch </Private-Package>
						<Include-Resource> META-INF/LICENCE=LICENSE,
							META-INF/NOTICE=NOTICE </Include-Resource>
					</instructions>
				</configuration>
			</plugin>
	<plugin>
		<groupId>org.apache.felix</groupId>
		<artifactId>maven-ipojo-plugin</artifactId>
		<version>1.1.0-SNAPSHOT</version>
		<executions>
			<execution>
				<goals>
					<goal>ipojo-bundle</goal>
				</goals>
				<configuration>
					<ignoreAnnotations>true</ignoreAnnotations>
					<metadata>
					<![CDATA[
						<ipojo>
							<component classname="org.apache.felix.ipojo.arch.ArchCommandImpl"
								public="false">
								<Provides />
								<requires field="m_archs" optional="true" />
								<requires field="m_factories" optional="true" />
								<requires field="m_handlers" optional="true" />
							</component>
							<instance component="org.apache.felix.ipojo.arch.ArchCommandImpl"
								name="ArchCommand" />
						</ipojo>
						]]>
					</metadata>
				</configuration>
			</execution>
		</executions>
	</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>
					</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>
</project>