Как настроить Ivy для сборки Ant

В настоящее время у меня ANT_HOME находится в /home/<myuser>/ant/1.8.4/ant-1.8.4.

Я только что загрузил tarball Apache Ivy, который включает в себя его зависимости. Я извлек его в /home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1.

Затем я скопировал /home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1/lib/*.jar в ANT_HOME/lib. Если мое понимание того, как Ant работает с плагинами/расширениями, является правильным, тогда Ant теперь сможет иметь доступ ко всем задачам Ivy во время выполнения.

Мой следующий вопрос: как определить задачи Ivy внутри моего файла сборки Ant? Скажем, я хочу использовать задачи ivy-retrieve, ivy-resolve и ivy-publish. Каковы все конфигурации, которые мне нужно выполнить (в XML), чтобы эти задачи работали при запуске моей сборки Ant из командной строки (я не буду строить через плагин Ant -Eclipse). Спасибо заранее!

Ответы

Ответ 1

Сначала вы должны определить <taskdef>, чтобы указать на задачи Ivy.

<property environment="env"/>
<property name="ivy.home" value="${env_IVY_HOME}"/>

<taskdef resource="org/apache/ivy/ant/antlib.xml">
    <classpath>
        <fileset dir="${ivy.home}">
            <include name="*.jar"/>
        </fileset>
    </classpath>
</taskdef>

Это даст вам доступ к задачам Ivy. Вы должны использовать следующие задачи:

<cachepath pathid="main.classpath" conf="compile"/>

Проблема заключается в том, что имена ваших задач Ivy могут столкнуться с другими задачами Ant. Например, есть задача Ivy <report>. Чтобы решить эту проблему, вы можете создать пространство имен Ivy. Для этого вы помещаете ссылку в ваше пространство имен в объект <project> следующим образом:

<project name="my.proj" default="package" basedir="."
    xmlns:ivy="antlib:org.apache.ivy.ant"/>

Теперь, когда вы определяете задачи Ivy, вы можете использовать эту ссылку antlib:org.apache.ivy.ant для своего пространства имен ivy. Та же задача, что и раньше, но с полем uri:

<property environment="env"/>
<property name="ivy.home" value="${env_IVY_HOME}"/>

<taskdef resource="org/apache/ivy/ant/antlib.xml"
    uri="antlib:org.apache.ivy.ant">
    <classpath>
        <fileset dir="${ivy.home}">
            <include name="*.jar"/>
        </fileset>
    </classpath>
</taskdef>

Кстати, в этом нет ничего особенного uri. Я мог бы сделать это:

<project name="my.proj" default="package" basename="."
   xmlns:ivy="pastrami:with.mustard">

[...]
<taskdef resource="org/apache/ivy/ant/antlib.xml"
    uri="pastrami:with.mustard">
    <classpath>
        <fileset dir="${ivy.home}">
            <include name="*.jar"/>
        </fileset>
    </classpath>
</taskdef>

Теперь можно указать имена задач с помощью ivy:. Вместо этого:

<cachepath pathid="main.classpath" conf="compile"/>

Теперь вы можете сделать это:

<ivy:cachepath pathid="main.classpath" conf="compile"/>

И как вы получите доступ к своим задачам Ivy Ant.

Теперь у вас есть доступ к вашим задачам Ivy Ant, вам нужно определить файл ivysettings.xml и использовать задачу <ivy:settings/>, чтобы указать там:

 <ivy:settings file="${ivy.home}/ivysettings.xml"/>

В Ivy есть файл по умолчанию ivysettings.xml, который укажет вам на всемирную систему репозитория Maven. Если у вас нет общедоступного репозитория Maven, вы можете использовать файл ivysettings.xml по умолчанию:

<ivy:settings/>

Это довольно просто.

Как только вы это сделали, вам нужно прочитать и resolve ваш файл ivy.xml, который обычно находится в корне ваш проект в том же каталоге, что и ваш файл build.xml.

В основном, ваш файл ivy.xml содержит ссылки на сторонние банки, которые вы хотите включить в свой проект. Например:

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

Что это значит, мне нужна log4j.jar (версия 1.2.17) для компиляции (и для компиляции тестов тоже), и мне нужно junit.jar (версия .4.10) для компиляции моего тестового кода.

compile->default - это сопоставление конфигурации моего compile с конфигурацией Maven default (в которой говорится, что я просто хочу, чтобы Jar и любые другие банки могли зависеть от них.

Где моя конфигурация compile? Я определяю его в своем ivy.xml. Существует десять стандартных конфигураций. Это также входит в ваш файл ivy.xml:

<configurations>
  <conf name="default" visibility="public" description="runtime dependencies and master artifact can be used with this conf" extends="runtime,master"/>
  <conf name="master" visibility="public" description="contains only the artifact published by this module itself, with no transitive dependencies"/>
  <conf name="compile" visibility="public" description="this is the default scope, used if none is specified. Compile dependencies are available in all classpaths."/>
  <conf name="provided" visibility="public" description="this is much like compile, but indicates you expect the JDK or a container to provide it. It is only available on the compilation classpath, and is not transitive."/>
  <conf name="runtime" visibility="public" description="this scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath." extends="compile"/>
  <conf name="test" visibility="private" description="this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases." extends="runtime"/>
  <conf name="system" visibility="public" description="this scope is similar to provided except that you have to provide the JAR which contains it explicitly. The artifact is always available and is not looked up in a repository."/>
  <conf name="sources" visibility="public" description="this configuration contains the source artifact of this module, if any."/>
  <conf name="javadoc" visibility="public" description="this configuration contains the javadoc artifact of this module, if any."/>
   <conf name="optional" visibility="public" description="contains all optional dependencies">
 </configurations>

Вы можете использовать любое имя конфигурации, которое вы хотите, но они сопоставляются с конфигурациями Maven по умолчанию и широко используются.

После определения вашего файла ivy.xml вы можете использовать <ivy.resolve> для разрешения ваших зависимостей:

<ivy:resolve/>

Итак, мы имеем следующее:

  • Как использовать <taskdef> в вашем build.xml для включения задач Ivy Ant в вашу сборку.
  • Как использовать задачу Ivy Ant <ivy:settings> для настройки Ivy.
  • Как использовать <ivy:resolve/> для чтения в вашем файле ivy.xml и разрешения зависимостей сторонних баннеров.

Теперь вы, вероятно, хотите использовать эти файлы jar. Существует три способа сделать это:

 <ivy:cachepath pathid="main.classpath" conf="compile"/>

Задача <ivy:cachepath/> создаст путь к классу (в этом случае называется main.classpath), который указывает на банки, которые у вас есть в конфигурации ivy.xml compile. Это используется большую часть времени.

Если вам нужен набор файлов, вы можете использовать это:

 <ivy:cachefileset setid="compile.fileset" conf="compile"/>

В этом случае он создаст набор файлов с refid compile.fileset.

Иногда вам приходится приносить банки в свой проект. Например, если вы создаете файл войны или уха, вы хотите заключить свои банки. В этом случае вы можете использовать это:

<property name="lib.dir" value="${target.dir}/lib"/>
<ivy:retrieve pattern="${lib.dir}/[artifact].[ext]"
     conf="runtime"/>

Это приведет ваши банки в каталог ${lib.dir}, поэтому вы можете включить их в войны или уши.

Извините за длинный ответ, но есть много шагов для покрытия. Я очень рекомендую книгу Manning Ant в действии, в которой есть целая глава о Ivy.

Ответ 2

Давид дал очень тонкий ответ, но я хотел бы указать, что taskdef не требуется. Если ivy.jar находится в ожидаемом месте, достаточно объявления пространства имен в верхней части файла ANT:

<project ..... xmlns:ivy="antlib:org.apache.ivy.ant">

Более подробно я бы рекомендовал прочитать о том, как работают ANT libs.

Следующий ответ дает еще несколько советов по настройке плюща: