<!-- 
 ! 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>
        <artifactId>apache-asterixdb</artifactId>
        <groupId>org.apache.asterix</groupId>
        <version>0.8.9-SNAPSHOT</version>
    </parent>
    <artifactId>asterix-app</artifactId>

    <licenses>
        <license>
            <name>Apache License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
            <distribution>repo</distribution>
            <comments>A business-friendly OSS license</comments>
        </license>
    </licenses>

    <properties>
        <appendedResourcesDirectory>${basedir}/src/main/appended-resources</appendedResourcesDirectory>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <fork>true</fork>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>jar</goal>
                            <goal>test-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>8.0.0.M2</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-servlet</artifactId>
            <version>8.0.0.M2</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.hyracks</groupId>
            <artifactId>hyracks-control-cc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.hyracks</groupId>
            <artifactId>hyracks-control-nc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.hyracks</groupId>
            <artifactId>algebricks-compiler</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.hyracks</groupId>
            <artifactId>hyracks-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.asterix</groupId>
            <artifactId>asterix-algebra</artifactId>
            <version>0.8.9-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.asterix</groupId>
            <artifactId>asterix-aql</artifactId>
            <version>0.8.9-SNAPSHOT</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.asterix</groupId>
            <artifactId>asterix-om</artifactId>
            <version>0.8.9-SNAPSHOT</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.asterix</groupId>
            <artifactId>asterix-metadata</artifactId>
            <version>0.8.9-SNAPSHOT</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.asterix</groupId>
            <artifactId>asterix-tools</artifactId>
            <version>0.8.9-SNAPSHOT</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.asterix</groupId>
            <artifactId>asterix-common</artifactId>
            <version>0.8.9-SNAPSHOT</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.asterix</groupId>
            <artifactId>asterix-common</artifactId>
            <version>0.8.9-SNAPSHOT</version>
            <type>test-jar</type>
            <scope>test</scope>
        </dependency>
		<!-- posssible remove this <dependency> <groupId>com.kenai.nbpwr</groupId> 
			<artifactId>org-apache-commons-io</artifactId> <version>1.3.1-201002241208</version> 
			<scope>test</scope> </dependency> -->
        <dependency>
            <groupId>org.apache.asterix</groupId>
            <artifactId>asterix-transactions</artifactId>
            <version>0.8.9-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <type>jar</type>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
            <version>2.9.1</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>xalan</groupId>
            <artifactId>xalan</artifactId>
            <version>2.7.1</version>
            <type>jar</type>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.asterix</groupId>
            <artifactId>asterix-test-framework</artifactId>
            <version>0.8.9-SNAPSHOT</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.10.19</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.e-movimento.tinytools</groupId>
            <artifactId>privilegedaccessor</artifactId>
            <version>1.2.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>
