Ответ 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.