<!--
 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>
			<module>webconsole-plugin</module>
		</modules>
	</profile>
	<profile>
		<id>java6</id>
		<activation>
			<jdk>1.6</jdk>
		</activation>
		<modules>
			<module>annotations</module>
			<module>handler/jmx</module>
			<module>webconsole-plugin</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>
