<?xml version="1.0" encoding="UTF-8"?>
<!--
    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.
-->

<!-- $Rev$ $Date$ -->

<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.geronimo.testsupport</groupId>
        <artifactId>test-deployment-javaee_5</artifactId>
        <version>4.0.0-SNAPSHOT</version>
    </parent>

    <artifactId>test-ear-javaee_5</artifactId>
    <name>Geronimo Test Support, Test Deployment JavaEE 5 :: EAR</name>
    <packaging>ear</packaging>
    
    <description>
        Geronimo test EAR for JavaEE 5.
    </description>
    
    <dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>test-war-javaee_5</artifactId>
            <version>${project.version}</version>
            <type>war</type>
        </dependency>
        
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>test-ejb-javaee_5</artifactId>
            <version>${project.version}</version>
            <type>ejb</type>
        </dependency>
        
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>test-rar-javaee_5</artifactId>
            <version>${project.version}</version>
            <type>rar</type>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-ear-plugin</artifactId>
                <configuration>
                    <displayName>Geronimo Test EAR for JavaEE 5</displayName>
                    <description>Test EAR for 5 testing</description>
                    <version>5</version>
                    <resourcesDir>${project.build.outputDirectory}</resourcesDir>
                    <modules>
                        <webModule>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>test-war-javaee_5</artifactId>
                            <contextRoot>/test-5</contextRoot>
                            <bundleFileName>web.war</bundleFileName>
                        </webModule>
                        
                        <ejbModule>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>test-ejb-javaee_5</artifactId>
                            <bundleFileName>ejb.jar</bundleFileName>
                        </ejbModule>
                        
                        <rarModule>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>test-rar-javaee_5</artifactId>
                            <bundleFileName>rar.rar</bundleFileName>
                        </rarModule>
                    </modules>
                </configuration>
            </plugin>
        </plugins>

    </build>
    
</project>
