Ant, использующий antlib с пространством имен

Я использую следующий демонстрационный скрипт:

<?xml version="1.0" encoding="UTF-8"?>
<project name="test" basedir="." xmlns:deploy="antlib:net.sf.antcontrib">
    <target name="default">
        <taskdef resource="net/sf/antcontrib/antlib.xml">
            <classpath>
                <pathelement location="lib/ant-contrib-1.0b3.jar"/>
            </classpath>
        </taskdef>
        <deploy:if>
            <isset property="defaultprop"/>
            <then>
                <echo message="it's set!"/>
            </then>
        </deploy:if>
    </target>
</project>

Когда я запускаю этот скрипт сборки (с целью default) ошибка

build.xml:9: Problem: failed to create task or type antlib:net.sf.antcontrib:if

Pathelement lib/ant-contrib-1.0b3.jar существует, и муравей забирает его. Я думаю, проблема в том, как я использую xmlns. Я беру это из другого примера, который у меня есть, который также не работает для меня (хотя он работает на определенном сервере!), И пытаюсь выяснить, что такое волшебный соус.

2 ответа

Решение

Ваша задача, в которую вы добавляете ant-contrib, должна объявить URI таким же, как пространство имен, которое вы определяете и префиксуете в проекте. Похоже на то, как здесь работает taskdef.

<project name="test" basedir="." xmlns:deploy="antlib:net.sf.antcontrib">
    <target name="default">
        <taskdef uri="antlib:net.sf.antcontrib" resource="net/sf/antcontrib/antlib.xml">
            <classpath>
                <pathelement location="lib/ant-contrib-1.0b3.jar"/>
            </classpath>
        </taskdef>
        <deploy:if>
            <isset property="defaultprop"/>
            <then>
                <echo message="it's set!"/>
            </then>
        </deploy:if>
    </target>
</project>

Ну, ошибка имеет if в конце, и речь идет о строке 9. Я думаю, что это проблема с синтаксисом этого тега:

    <deploy:if>

Я не могу найти никакой документации по тегу "deploy:if" или даже по тегу "deploy". Я думаю, что в Ant нет задачи "развернуть" - нужно сделать цель"развернуть".

Как насчет попробовать это:

  <if>
    <isset property="defaultprop"/>
    <then>
      <antcall target="deploy" />
    </then>
  </if>

Как я прочитал, он проверит isset, а затем вызовет цель "deploy", если она установлена. Конечно, вам нужно сделать цель 'deploy' сейчас:)

Другие вопросы по тегам