<!--
 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</artifactId>
    <version>1.0.4</version>
    <relativePath>../pom/pom.xml</relativePath>
  </parent>

  <modelVersion>4.0.0</modelVersion>
  <artifactId>iPOJO</artifactId>
  <groupId>org.apache.felix</groupId>
  <name>Apache Felix iPOJO</name>
  <version>1.3.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  
  	<modules>
		<module>metadata</module>
		<module>manipulator</module>
		<module>plugin</module>
		<module>core</module>
		<module>composite</module>
		<module>arch</module>
		<module>ant</module>
		<module>handler/extender</module>
		<module>handler/temporal</module>
		<module>handler/eventadmin</module>
		<module>handler/whiteboard</module>
		<module>api</module>
		<module>online-manipulator</module>
		<module>junit4osgi</module>
	</modules>
		
	
  <profiles>
	<profile>
		<id>java5</id>
		<activation>
			<jdk>1.5</jdk>
		</activation>
		<modules>
			<module>annotations</module>
			<module>handler/jmx</module>
		</modules>
	</profile>
	<profile>
		<id>java6</id>
		<activation>
			<jdk>1.6</jdk>
		</activation>
		<modules>
			<module>annotations</module>
			<module>handler/jmx</module>
		</modules>
	</profile>
	<profile>
		<id>examples</id>
		<modules>
			<module>examples</module>
		</modules>
	</profile>
	<profile>
		<id>tests</id>
		<modules>
			<module>tests</module>
		</modules>
	</profile>
  </profiles>
  
    <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>rat-maven-plugin</artifactId>
        <version>1.0-alpha-3</version>
        <configuration>
        	<excludeSubProjects>true</excludeSubProjects>
        	<excludes>
        		<param>**/*</param>
        	</excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>

  
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
          <aggregate>true</aggregate>
          <show>private</show>
        </configuration>
      </plugin>
    </plugins>
  </reporting>

</project>
