<!--
    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:git:https://github.com/apache/felix-dev.git</connection>
        <developerConnection>scm:git:https://github.com/apache/felix-dev.git</developerConnection>
        <url>https://gitbox.apache.org/repos/asf?p=felix-dev.git</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>
