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

  <modelVersion>4.0.0</modelVersion>
  <artifactId>iPOJO</artifactId>
  <groupId>org.apache.felix</groupId>
  <name>Apache Felix iPOJO ~ Reactor</name>
  <version>1.5.0-SNAPSHOT</version>
  <packaging>pom</packaging>

    <modules>
    <module>metadata</module>
    <module>manipulator</module>
    <module>core</module>
    <module>composite</module>
    <module>arch</module>
    <module>handler/extender</module>
    <module>handler/temporal</module>
    <module>handler/eventadmin</module>
    <module>handler/whiteboard</module>
    <module>api</module>
    <!-- remove junit4osgi during the release process
    <module>junit4osgi</module> -->
  </modules>


  <profiles>
  <profile>
    <id>junit4osgi</id>
    <modules>
      <module>junit4osgi</module>
    </modules>
  </profile>
  <profile>
    <id>java5</id>
    <activation>
      <jdk>1.5</jdk>
    </activation>
    <modules>
      <module>annotations</module>
      <module>arch-gogo</module>
      <module>handler/jmx</module>
      <module>webconsole-plugin</module>
      <module>handler/transaction</module>
    </modules>
  </profile>
  <profile>
    <id>java6</id>
    <activation>
      <jdk>1.6</jdk>
    </activation>
    <modules>
      <module>annotations</module>
      <module>arch-gogo</module>
      <module>handler/jmx</module>
      <module>webconsole-plugin</module>
      <module>handler/transaction</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>
