Как динамически включить ant-contrib.jar в Ant
Я ищу способ включить.jar из файла Ant, чтобы я мог сразу использовать его и вызывать его методы в своих целях. В моем случае это ant-contrib-1.0b3.jar
,
2 ответа
Лучший способ - поместить jar-файл Ant-Contrib в ваш проект. Например, скажем, build.xml
находится в корне вашего проекта. Создайте каталог с именем ant.lib\ant-contrib
внутри вашего проекта, а затем положить ant-contrib*.jar
в этой папке. Вы можете использовать этот метод для других необязательных задач Ant, которые могут вам понадобиться (например, Ivy, Findbugs, Cobrrtura и т. Д.).
Тогда в вашем build.xml
файл, вы можете сделать это:
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<fileset dir="${basedir}/ant.lib/ant-contrib"/>
</classpath>
</taskdef>
Мне нравится делать это таким образом, потому что дополнительные проекты с задачами включены в проект. Если вы все проверяете в своей системе контроля версий, кто-то может проверить ваш код и выполнить сборку, не загружая Ant-Contrib и не устанавливая его самостоятельно.
Вы можете определить пространства имен XML. Это дает вашим задачам Ant-Contrib префикс, чтобы избежать коллизий имен задач в случае, если вы используете другие необязательные задачи ant с таким же именем. Кроме того, он предупреждает пользователей, что это не стандартная задача Ant.
Если вы используете пространство имен XML, вам нужно поместить объявление XMLNS в свой <project>
заголовок. Он будет содержать URI, который соединит ваши задачи Ant Contrib с вашим пространством имен XML. Например, ac:
пространство имен предназначено для всех задач Ant Contrib:
<project name="my.project" default="package" basedir="."
xmlns:ac="http://ant-contrib.sourceforge.net">
<taskdef resource="net/sf/antcontrib/antlib.xml"
uri="http://ant-contrib.sourceforge.net">
<classpath>
<fileset dir="${basedir}/ant.lib/ant-contrib"/>
</classpath>
</taskdef>
Это соответствует XML-пространству имен (xmlns) ac
с URI http://ant-contrib.sourceforge.net
, URI может быть чем угодно. Например:
<project name="my.project" default="package" basedir="."
xmlns:ac="hamburger:with-fries">
<taskdef resource="net/sf/antcontrib/antlib.xml"
uri="hamburger:with-fries">
<classpath>
<fileset dir="${basedir}/ant.lib/ant-contrib"/>
</classpath>
</taskdef>
Стандарт должен использовать что-то вроде antlib:net.sf.antcontrib
:
<project name="my.project" default="package" basedir="."
xmlns:ac="antlib:net.sf.antcontrib">
<taskdef resource="net/sf/antcontrib/antlib.xml"
uri="antlib:net.sf.antcontrib">
<classpath>
<fileset dir="${basedir}/ant.lib/ant-contrib"/>
</classpath>
</taskdef>
Однако мне нравится использовать URL проекта. Таким образом, если кому-то нужна документация по задачам Ant-Contrib, он знает URL-адрес, на котором находится проект Ant-Contrib.
Во всех трех приведенных выше случаях я определил пространство имен XML с помощью ac
, Таким образом, вы должны поставить перед всеми именами задач Ant-Contrib префикс ac:
, Вы могли бы использовать antcontrib
или что угодно. С ac:
namespace, ваши задачи Ant-contrib будут выглядеть так:
<ac:if>
<istrue value="${include.debug.code}"/>
<ac:then>
[...]
</ac:then>
<ac:else>
[...]
</ac:else>
<ac:if>
Если вы пропустите все пространство имен, вы можете просто использовать задачи Ant-Contrib, как описано в документации:
<if>
<istrue value="${include.debug.code}"/>
<then>
[...]
</then>
<else>
[...]
</else>
Лучшее решение - интегрировать менеджер зависимостей apache ivy. Плющ может использоваться для управления всеми вашими классами путей сборки в стиле Maven!
пример
ivy.xml
Этот файл описывает сторонние зависимости вашего проекта. Айви использует конфигурации для логической группировки файлов. В вашем случае обратите внимание, что специальная конфигурация "build" используется для настройки задач ANT, необходимых для сборки:
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<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"/>
<conf name="build" description="3rd party ANT tasks"/>
</configurations>
<dependencies>
<!-- compile dependencies -->
<dependency org="org.slf4j" name="slf4j-api" rev="1.6.4" conf="compile->default"/>
<!-- 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"/>
<!-- Build dependencies -->
<dependency org="ant-contrib" name="ant-contrib" rev="1.0b3" conf="build->default"/>
</dependencies>
</ivy-module>
Замечания:
- По умолчанию зависимости извлекаются из Maven Central, который теперь содержит около 90% jar-файлов с открытым исходным кодом.
build.xml
<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant" xmlns:antcontrib="antlib:net.sf.antcontrib">
<target name="bootstrap" description="Install ivy">
<mkdir dir="${user.home}/.ant/lib"/>
<get src="https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.apache.ivy&a=ivy&v=LATEST&e=jar"
dest="${user.home}/.ant/lib/ivy.jar"/>
</target>
<target name="init" description="Use ivy to resolve classpaths">
<ivy:resolve/>
<ivy:report todir='build/ivy-reports' graph='false' xml='false'/>
<ivy:cachepath pathid="compile.path" conf="compile"/>
<ivy:cachepath pathid="runtime.path" conf="runtime"/>
<ivy:cachepath pathid="test.path" conf="test"/>
<ivy:cachepath pathid="build.path" conf="build"/>
</target>
<target name="taskdefs" depends="init" description="Declare 3rd party ANT tasks">
<taskdef uri="antlib:net.sf.antcontrib" classpathref="build.path"/>
</target>
<target name="build" depends="taskdefs" description="Build logic using ant-contrib tasks">
<echo message="The first five letters of the alphabet are:"/>
<antcontrib:for list="a,b,c,d,e" param="letter">
<sequential>
<echo>Letter @{letter}</echo>
</sequential>
</antcontrib:for>
</target>
<target name="clean" description="Cleanup build files">
<delete dir="build"/>
</target>
<target name="clean-all" depends="clean" description="Additionally purge ivy cache">
<ivy:cleancache/>
</target>
</project>
Заметки:
- Существует специальная цель "начальной загрузки", используемая для запуска новой установки. К сожалению, плющ не распространяется с ядром ANT
- Задача плюща cachepath используется для создания ANT-путей, содержащих файлы jar, загруженные и кэшированные ivy.
- Задача ivy report очень полезна для понимания транзитивных зависимостей ваших сторонних библиотек.
- В настоящее время antcontrib распространяется как ANT-библиотека, объясняющая странные вещи с пространством имен.