Как динамически включить 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&amp;g=org.apache.ivy&amp;a=ivy&amp;v=LATEST&amp;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-библиотека, объясняющая странные вещи с пространством имен.
Другие вопросы по тегам