Как настроить 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/>
Итак, у нас есть следующее:
- как использовать
<taskdef>
в своемbuild.xml
чтобы включить задачи Ivy Ant в вашу сборку. - как использовать задачу плющ Муравей
<ivy:settings>
для настройки Ivy. - как использовать
<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">
для более подробной информации я рекомендую прочитать о том, как библиотеки АНТ работа.
следующий ответ дает еще несколько советов "настройка плюща":