<!--
  ~  * 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/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.apache.myfaces.html5</groupId>
        <artifactId>myfaces-html5-project</artifactId>
        <version>0.0.4-SNAPSHOT</version>
    </parent>

    <groupId>org.apache.myfaces.html5</groupId>
    <artifactId>myfaces-html5-demo</artifactId>
    <name>MyFaces Html5 Demo</name>
    <description>Demo of Apache MyFaces Html5</description>
    <packaging>war</packaging>

    <repositories>
        <repository>
            <id>java.net</id>
            <url>http://download.java.net/maven/2</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>

        <repository>
            <id>Maven2 Repo1</id>
            <name>Maven2 Repo1</name>
            <url>http://repo1.maven.org/maven2</url>
            <layout>legacy</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>

        <repository>
            <id>java.net.2</id>
            <name>java.net Maven 2 Repository</name>
            <url>http://download.java.net/maven/2</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>

        <repository>
            <id>codehaus</id>
            <name>codehaus</name>
            <url>http://repository.codehaus.org</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>

        <repository>
            <id>jboss</id>
            <name>jboss</name>
            <url>http://repository.jboss.com/maven2</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>

        <!-- necessary! -->
        <repository>
            <id>myfaces-snapshots</id>
            <name>myfaces-snapshots</name>
            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>

    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.apache.myfaces.html5</groupId>
            <artifactId>myfaces-html5-core</artifactId>
            <version>${parent.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.13</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>el-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>maven-jetty-plugin</artifactId>
                <version>6.1.22</version>
                <configuration>
                    <scanIntervalSeconds>10</scanIntervalSeconds>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>