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

<ivy-module version="2.0">
    <info 
      organisation="org.apache.gora"
      module="gora-tutorial"
      status="integration"/>

  <configurations>
    <include file="../../ivy/ivy-configurations.xml"/>
  </configurations>

  <publications defaultconf="compile">
    <artifact name="gora-tutorial" conf="compile"/>
  </publications>

  <dependencies>
    <dependency org="org.apache.gora" name="gora-hbase" rev="latest.integration" changing="true" conf="*->@"/>
    <dependency org="org.apache.gora" name="gora-sql" rev="latest.integration" changing="true" conf="*->@"/>
    
    <!-- Uncomment below if you are using MySQL -->
    <!-- <dependency org="mysql" name="mysql-connector-java" rev="5.1.13" conf="*->default"/> -->

    <!-- Uncomment below if you are using Hsqldb -->
    <!--<dependency org="org.hsqldb" name="hsqldb" rev="2.0.0" conf="*->default"/>-->

  </dependencies>
</ivy-module>

