///////////////////////////////////////////////////////////////
 * 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.
///////////////////////////////////////////////////////////////

[[howto-depend-on-zest,Depend on Zest™ in your build]]
= Depend on Zest™ in your build =

NOTE: Some of the <<libraries>> and <<extensions>> depend on artifacts that are not deployed in central, you'll need to
add other repositories to your build scripts accordingly.

Release artifacts, including sources and javadoc, are deployed to Maven Central:

http://repo1.maven.org/maven2/ (US)

http://uk.maven.org/maven2/ (Europe)

Snapshot artifacts, including sources and javadoc, are built against the `develop` branch and deployed weekly to the Apache SNAPSHOTS repository:

http://repository.apache.org/snapshots/


== Manually ==

If you don't rely on your build scripts dependency resolution mechanism you should
https://zest.apache.org/download.html[download] the SDK distribution.


== Using Maven ==

You simply declare dependencies on Zest™ artifacts:

[source,xml]
----
<dependencies>
    <dependency>
        <groupId>org.apache.zest.core</groupId>
        <artifactId>org.apache.zest.core.bootstrap</artifactId>
        <version>ZEST_VERSION</version>
    </dependency>
    <dependency>
        <groupId>org.apache.zest.core</groupId>
        <artifactId>org.apache.zest.core.runtime</artifactId>
        <version>ZEST_VERSION</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.zest.core</groupId>
        <artifactId>org.apache.zest.core.testsupport</artifactId>
        <version>ZEST_VERSION</version>
        <scope>test</scope>
    </dependency>
</dependencies>
----

Where `ZEST_VERSION` is the Zest™ version you want to use.

If you want to use +-SNAPSHOT+ versions, you need to register the Apache Snapshots repository:

[source,xml]
----
<repositories>
    <repository>
        <id>apache-snapshots</id>
        <url>https://repository.apache.org/snapshots/</url>
        <releases><enabled>false</enabled></releases>
        <snapshots><enabled>true</enabled></snapshots>
    </repository>
</repositories>
----


== Using Gradle ==

You simply declare dependencies on Zest™ artifacts:

[source,groovy]
----
dependencies {
    compile     "org.apache.zest.core:org.apache.zest.core.bootstrap:ZEST_VERSION"
    runtime     "org.apache.zest.core:org.apache.zest.core.runtime:ZEST_VERSION"
    testCompile "org.apache.zest.core:org.apache.zest.core.testsupport:ZEST_VERSION"
}
----

Where `ZEST_VERSION` is the Zest™ version you want to use.

If you want to use +-SNAPSHOT+ versions, you need to register the Apache Snapshots repository:

[source,groovy]
----
repositories {
    maven { name 'apache-snapshots'; url "https://repository.apache.org/snapshots/" }
}
----


== Using Buildr ==

You simply declare dependencies on Zest™ artifacts:

[source,ruby]
----
compile.with 'org.apache.zest.core:org.apache.zest.core.bootstrap:ZEST_VERSION'
package(:war).with :libs => 'org.apache.zest.core:org.apache.zest.core.runtime:ZEST_VERSION'
test.with 'org.apache.zest.core:org.apache.zest.core.testsupport:ZEST_VERSION'
----

Where `ZEST_VERSION` is the Zest™ version you want to use.

If you want to use +-SNAPSHOT+ versions, you need to register the Apache Snapshots repository:

[source,ruby]
----
repositories.remote << 'https://repository.apache.org/snapshots/'
----


== Using SBT ==

You simply declare dependencies on Zest™ artifacts:

[source,scala]
----
libraryDependencies += \
    "org.apache.zest.core" % "org.apache.zest.core.bootstrap" % "ZEST_VERSION" \
    withSources() withJavadoc()
libraryDependencies += \
    "org.apache.zest.core" % "org.apache.zest.core.runtime" % "ZEST_VERSION" % "runtime" \
    withSources() withJavadoc()
libraryDependencies += \
    "org.apache.zest.core" % "org.apache.zest.core.testsupport" % "ZEST_VERSION" % "test" \
    withSources() withJavadoc()
----

Where `ZEST_VERSION` is the Zest™ version you want to use.

If you want to use +-SNAPSHOT+ versions, you need to register the Apache Snapshots repository:

[source,scala]
----
resolvers += "apache-snapshots" at "https://repository.apache.org/snapshots/"
----


== Using Ivy ==

You simply declare dependencies on Zest™ artifacts:

[source,xml]
----
<ivy-module>
    <dependencies>
        <dependency org="org.apache.zest.core" name="org.apache.zest.core.bootstrap"
                    rev="ZEST_VERSION"  conf="default" />
        <dependency org="org.apache.zest.core" name="org.apache.zest.core.runtime"
                    rev="ZEST_VERSION"  conf="runtime" />
        <dependency org="org.apache.zest.core" name="org.apache.zest.core.testsupport"
                    rev="ZEST_VERSION"  conf="test" />
    </dependencies>
</ivy-module>
----

Where `ZEST_VERSION` is the Zest™ version you want to use.

If you want to use +-SNAPSHOT+ versions, you need to register the Apache Snapshots repository in a `ivysettings.xml` file:

[source,xml]
----
<ivysettings>
    <settings defaultResolver="chain"/>
    <resolvers>
        <chain name="chain">
            <ibiblio name="apache-snapshots" m2compatible="true"
                     root="https://repository.apache.org/snapshots/"/>
        </chain>
    </resolvers>
</ivysettings>
----
