<ivysettings>

 <!--
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.
-->

 <!--
  see http://www.jayasoft.org/ivy/doc/configuration
  -->
  <!-- you can override this property to use mirrors
          https://repo1.maven.org/maven2/
          http://mirrors.dotsrc.org/maven2
          http://ftp.ggi-project.org/pub/packages/maven2
          http://mirrors.sunsite.dk/maven2
          http://public.planetmirror.com/pub/maven2
          http://ibiblio.lsu.edu/main/pub/packages/maven2
          http://www.ibiblio.net/pub/packages/maven2
  -->
  <property name="repo.maven.org" value="https://repo1.maven.org/maven2/"
      override="false"/>
  <property name="snapshot.apache.org"
      value="https://repository.apache.org/content/repositories/snapshots/"
      override="false"/>
  <property name="staging.cloudera.com"
      value="https://repository.cloudera.com/content/repositories/staging/"
      override="false"/>
  <property name="releases.cloudera.com"
      value="https://repository.cloudera.com/content/repositories/releases/"
      override="false"/>
  <property name="www.datanucleus.org"
      value="http://www.datanucleus.org/downloads/maven2/"
      override="false"/>
  <property name="maven2.pattern"
      value="[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier])"/>
  <property name="repo.dir" value="${user.home}/.m2/repository"/>
  <property name="ivy.cache.dir" value="${user.home}/.ivy2/cache"/>
  <property name="maven2.pattern.ext"  value="${maven2.pattern}.[ext]"/>
  <property name="resolvers" value="default" override="false"/>
  <settings defaultResolver="${resolvers}"/>

  <resolvers>
    <ibiblio name="maven2" root="${repo.maven.org}"
        pattern="${maven2.pattern.ext}" m2compatible="true"/>
    <ibiblio name="datanucleus" root="${www.datanucleus.org}"
        pattern="${maven2.pattern.ext}" m2compatible="true"/>
    <ibiblio name="cloudera-releases" root="${releases.cloudera.com}"
        pattern="${maven2.pattern.ext}" m2compatible="true"/>
    <ibiblio name="apache-snapshot" root="${snapshot.apache.org}"
        m2compatible="true" checkmodified="true" changingPattern=".*SNAPSHOT"/>
    <ibiblio name="cloudera-staging" root="${staging.cloudera.com}"
        m2compatible="true" checkmodified="true" changingPattern=".*SNAPSHOT"/>
     <!--Conjars had to be added due to hive's dependency on calcite, which depends on pentaho-aggdesigner-algorithm;5.1.5-jhyde, which is only available in conjars and spring plugins repo -->
     <ibiblio name="conjars" m2compatible="true" root="http://conjars.org/repo/"/>
    <filesystem name="fs" m2compatible="true">
       <artifact pattern="${repo.dir}/[organisation]/[module]/[revision]/[module]-[revision](-[classifier]).[ext]"/>
       <ivy pattern="${repo.dir}/[organisation]/[module]/[revision]/[module]-[revision].pom"/>
    </filesystem>

    <filesystem name="fs2">
       <artifact pattern="${ivy.cache.dir}/[organisation]/[module]/jars/[module]-[revision](-[classifier]).[ext]"/>
       <ivy pattern="${ivy.cache.dir}/[organisation]/[module]/ivy-[revision].xml"/>
    </filesystem>

    <chain name="default" dual="true" checkmodified="true"
        changingPattern=".*SNAPSHOT">
      <resolver ref="fs2"/>
      <resolver ref="fs"/>
      <resolver ref="apache-snapshot"/>
      <resolver ref="datanucleus"/>
      <resolver ref="cloudera-releases"/>
      <resolver ref="cloudera-staging"/>
      <resolver ref="maven2"/>
      <resolver ref="conjars"/>
    </chain>

    <chain name="internal" dual="true">
      <resolver ref="fs2"/>
      <resolver ref="fs"/>
      <resolver ref="apache-snapshot"/>
      <resolver ref="datanucleus"/>
      <resolver ref="cloudera-staging"/>
      <resolver ref="maven2"/>
      <resolver ref="conjars"/>
    </chain>

    <chain name="external">
      <resolver ref="maven2"/>
      <resolver ref="conjars"/>
    </chain>

  </resolvers>
  <modules>
     <module organisation="org.apache.hadoop" name="hadoop-*" resolver="${resolvers}"/>
  </modules>
</ivysettings>
