<!--
 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>
    <groupId>org.apache.felix</groupId>
    <artifactId>felix</artifactId>
    <version>1.0.1</version>
    <relativePath>../../pom/pom.xml</relativePath>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>org.apache.felix.ipojo.annotations</artifactId>
  <packaging>bundle</packaging>
  <version>0.7.5-SNAPSHOT</version>
  <name>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.1.0-SNAPSHOT</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>
</project>