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

и ANT_HOME расположенном в /home/<myuser>/ant/1.8.4/ant-1.8.4.

Я только что скачал Apache Ivy tarball, который включает в себя его зависимости. Я извлек его /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 to ANT_HOME/lib. Если мое понимание того, как Ant работает с плагинами/расширениями, правильно, то Ant теперь должен иметь доступ ко всем задачам Ivy во время выполнения.

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

2 ответов


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

<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"/>

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

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

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

<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"/>

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

<ivy:settings/>

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

как только вы это сделаете, вам нужно прочитать В и resolve код ivy.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 конфигурация (которая говорит, что я просто хочу банку и любые другие банки, от которых она может зависеть.

где моя compile настройки берутся? Я определяю это в моем 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/>

Итак, у нас есть следующее:

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

теперь вы, вероятно,хотите использовать эти файлы jar. Есть три способа сделать это:--51-->

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

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

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

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

в этом случае он создаст fileset с refid compile.fileset.

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

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

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

извините за долгий ответ, но есть много шагов, чтобы покрыть. Я настоятельно рекомендую книгу Мэннинга Муравей в действии в которой есть целая глава об Айви.


Дэвид дал очень хороший ответ, но я хотел бы отметить, что taskdef не требуется. При условии плюща.jar находится в ожидаемом месте объявление пространства имен в верхней части файла ANT достаточно:

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

для более подробной информации я рекомендую прочитать о том, как библиотеки АНТ работа.

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