sample example which explain how to use filesystem resolver

The ivysettings.xml file is located by default in the same directory as the ivy.xml file.

Alternative locations can be specified using the ivy settings task

Project structure

3rd party dependencies located in the lib directory.

$ tree
.
|-- build.xml
|-- ivysettings.xml
|-- ivy.xml
|-- lib
|   |-- junit-4.10.jar
|   |-- slf4j-api-1.6.4.jar
|   `-- slf4j-simple-1.6.4.jar
`-- src
    |-- main
    |   `-- java
    |       `-- org
    |           `-- demo
    |               `-- App.java
    `-- test
        `-- java
            `-- org
                `-- demo
                    `-- AppTest.java

10 directories, 8 files

ivy.xml

This ivy file uses configurations to manages 3 kinds of dependencies:

  1. compile
  2. runtime
  3. test

These will correspond to the classpaths used by the ANT build.

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>

    <configurations defaultconfmapping="compile->default">
        <conf name="compile" description="Required to compile application"/>
        <conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
        <conf name="test"    description="Required for test only" extends="runtime"/>
    </configurations>

    <dependencies>
        <!-- compile dependencies -->
        <dependency org="org.slf4j" name="slf4j-api" rev="1.6.4"/>

        <!-- runtime dependencies -->
        <dependency org="org.slf4j" name="slf4j-simple" rev="1.6.4" conf="runtime->default"/>

        <!-- test dependencies -->
        <dependency org="junit" name="junit" rev="4.10" conf="test->default"/>
    </dependencies>

</ivy-module>

ivysettings.xml

Nothing fancy. Simple mapping to the jars located in the lib directory:

<ivysettings>
    <settings defaultResolver="local"/>
    <resolvers>
        <filesystem name="local">
            <artifact pattern="${ivy.settings.dir}/lib/[artifact]-[revision].[ext]"/>
        </filesystem>
    </resolvers>
</ivysettings>

Alternatively….. I would always include the Maven central repo for non-local jars as follows:

<ivysettings>
    <settings defaultResolver="central"/>
    <resolvers>
        <ibiblio name="central" m2compatible="true"/>
        <filesystem name="local">
            <artifact pattern="${ivy.settings.dir}/lib/[artifact]-[revision].[ext]"/>
        </filesystem>
    </resolvers>
    <modules>
        <module organisation="org.slf4j" resolver="local"/>
        <module organisation="junit" name="junit" resolver="local"/>
    </modules>
</ivysettings>

The modules section specifies which jars should be retrieved locally.

build.xml

Finally the build logic that uses ivy to manage the classpaths.

<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">

    <!--
    ================
    Build properties
    ================
    -->
    <property name="src.dir" location="src/main/java"/>
    <property name="test.src.dir" location="src/test/java"/>
    <property name="build.dir" location="build"/>
    <property name="classes.dir" location="${build.dir}/classes"/>
    <property name="test.classes.dir" location="${build.dir}/test-classes"/>
    <property name="ivy.reports.dir"  location="${build.dir}/ivy-reports"/>
    <property name="test.reports.dir"  location="${build.dir}/test-reports"/>

    <!--
    ===========
    Build setup
    ===========
    -->
    <target name="init">
        <ivy:resolve/>

        <ivy:report todir="${ivy.reports.dir}" graph="false" xml="false"/>

        <ivy:cachepath pathid="https://stackoverflow.com/questions/10175000/compile.path" conf="compile"/>
        <ivy:cachepath pathid="runtime.path" conf="runtime"/>
        <ivy:cachepath pathid="test.path"    conf="test"/>

        <mkdir dir="${classes.dir}"/>
        <mkdir dir="${test.classes.dir}"/>
        <mkdir dir="${test.reports.dir}"/>
    </target>

    <!--
    ===============
    Compile targets
    ===============
    -->
    <target name="compile" depends="init">
        <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false" debug="true" classpathref="https://stackoverflow.com/questions/10175000/compile.path"/>
    </target>

    <target name="compile-tests" depends="compile">
        <javac srcdir="${test.src.dir}" destdir="${test.classes.dir}" includeantruntime="false" debug="true">
            <classpath>
                <path refid="test.path"/>
                <pathelement path="${classes.dir}"/>
            </classpath>
        </javac>
    </target>

    <!--
    ============
    Test targets
    ============
    -->
    <target name="test" depends="compile-tests">
        <junit printsummary="yes" haltonfailure="yes">
            <classpath>
                <path refid="test.path"/>
                <pathelement path="${classes.dir}"/>
                <pathelement path="${test.classes.dir}"/>
            </classpath>
            <formatter type="xml"/>
            <batchtest fork="yes" todir="${test.reports.dir}">
                <fileset dir="${test.src.dir}">
                    <include name="**/*Test*.java"/>
                    <exclude name="**/AllTests.java"/>
                </fileset>
            </batchtest>
        </junit>
    </target>

    <!--
    =====================
    Build and run targets
    =====================
    -->
    <target name="build" depends="test"/>

    <target name="run" depends="build">
        <java classname="org.demo.App">
            <classpath>
                <path refid="runtime.path"/>
                <pathelement location="${classes.dir}"/>
            </classpath>
        </java>
    </target>

    <!--
    =============
    Clean targets
    =============
    -->
    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <target name="clean-all" depends="clean">
        <ivy:cleancache/>
    </target>

</project>

Leave a Comment