<!--
    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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.apache.felix.logback.reactor</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <name>Apache Felix Logback ITests Reactor</name>
    <artifactId>org.apache.felix.logback.itests.reactor</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <scm>
        <connection>scm:svn:http://svn.apache.org/repos/asf/felix/trunk/logback/itests</connection>
        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/trunk/logback/itests</developerConnection>
        <url>http://svn.apache.org/viewvc/felix/trunk/logback/itests/</url>
    </scm>

    <modules>
        <module>test-helper</module>
        <module>immediate-equinox-logservice</module>
        <module>immediate-felix-logservice</module>
        <module>immediate-jbl</module>
        <module>immediate-jcl</module>
        <module>immediate-jul</module>
        <module>immediate-jul-felix</module>
        <module>immediate-log4j1</module>
        <module>immediate-log4j2</module>
        <module>immediate-slf4j</module>
        <module>standard-equinox-logservice</module>
        <module>standard-felix-logservice</module>
        <module>standard-jbl</module>
        <module>standard-jcl</module>
        <module>standard-jul</module>
        <module>standard-log4j1</module>
        <module>standard-log4j2</module>
        <module>standard-slf4j</module>
    </modules>
</project>
