<!--
 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>
  <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>handler/transaction</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>
