<!--
 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>
    <artifactId>iPOJO</artifactId>
    <groupId>org.apache.felix</groupId>
    <version>0.7.6-SNAPSHOT</version>
    <relativePath>../pom.xml</relativePath>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>org.apache.felix.ipojo.annotations</artifactId>
  <packaging>bundle</packaging>
  <name>Apache Felix iPOJO Annotations</name>
  <build>
  <plugins>
  <plugin>
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-compiler-plugin</artifactId>
		<configuration>
		<source>1.5</source>
		<target>1.5</target>
		</configuration>
	</plugin>
  	<plugin>
    	<groupId>org.apache.felix</groupId>
    	<artifactId>maven-bundle-plugin</artifactId>
        <version>1.4.0</version>
    	<extensions>true</extensions>
    	<configuration>
        	<instructions>          
          		<Bundle-Name>iPOJO Annotation</Bundle-Name>
		        <Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
        		<Bundle-Description> iPOJO Annotations </Bundle-Description>
          		<Export-Package>org.apache.felix.ipojo.annotations</Export-Package>
        	</instructions>
    	</configuration>
  	</plugin>
  </plugins>
  </build>
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <configuration>
          <configLocation>http://people.apache.org/~clement/styles/checkstyle_ipojo.xml</configLocation>
        </configuration>
      </plugin>
    </plugins>
  </reporting>
</project>