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