Ant: не удалось создать задачу или тип

(Да, я читал и играл на основе ответов на подобные вопросы на этом форуме и многих других, таких как JavaRanch - пока не помогло.)

Я создал пользовательскую задачу ant в соответствии с документом Apache.

Запуск ant, я получаю:

BUILD FAILED
/home/russ/blackpearl/fun/build.xml:121: Problem: failed to create task or type sqlscriptpreprocessor
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place.
at org.apache.tools.ant.UnknownElement.getNotFoundException(UnknownElement.java:487)
at org.apache.tools.ant.UnknownElement.makeObject(UnknownElement.java:419)
at org.apache.tools.ant.UnknownElement.maybeConfigure(UnknownElement.java:163)
at org.apache.tools.ant.Task.perform(Task.java:347)

Это соответствует цели в моем файле build.xml:

<target name="mysql-preprocess"
        description="Preprocess MySQL database scripts into one file">
    <sqlscriptpreprocessor inputfilepath="${basedir}/extras/blackpearl.sql.in"
                          outputfilepath="${basedir}/extras/blackpearl.sql" />
</target>

У меня есть ant -contrib-1.0b3.jar на пути * $ANT_HOME/lib *. У меня есть sqlscriptpreprocessor.jar по этому пути, плюс локальный путь к моей сборке.

В попытке изгнать эту проблему я пробовал каждую комбинацию из следующего набора операторов, которые я выбрал по всему сайту через Google, что означает один из < taskdef ant -contrib > с одним из < taskdef sqlscriptpreprocessor > конструкции, два из первых с одним из последних, один из первых с двумя из последних, все вместе, ни один из них и т.д.

<taskdef resource="net/sf/antcontrib/antlib.xml" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
    <classpath>
        <pathelement location="/home/russ/dev/downloads/ant-contrib/ant-contrib-1.0b3.jar" />
    </classpath>
</taskdef>

<taskdef name="sqlscriptpreprocessor" classname="com.etretatlogiciels.ant.task.SqlScriptPreprocessor" />
<taskdef resource="${basedir}/lib/ant-tasks/SqlScriptPreprocessor.properties"
         classpath="${basedir}/lib/ant-tasks/sqlscriptpreprocessor.jar" />
<taskdef resource="${basedir}/lib/ant-tasks/SqlScriptPreprocessor.properties">
    <classpath>
        <pathelement location="${basedir}/lib/ant-tasks/sqlscriptpreprocessor.jar" />
    </classpath>
</taskdef>

Это расстраивает то, что это не так просто, как говорится, чтобы добавить пользовательские задачи в ant.

Я бы очень признателен за любые комментарии.

Спасибо,

Расс

Ответ 1

Я боролся с этим уже два дня. Ответ, который я получаю, подразумевается http://ant.apache.org/manual/tutorial-writing-tasks.html:

< taskdef name= "sqlscriptpreprocessor"... > элемент должен быть помещен внутри целевой, которая его использует, в этом случае mysql-preprocess. Я этого не делал. Теперь у меня есть:

<target name="mysql-preprocess"
        description="Preprocess MySQL database scripts into one file">
    <taskdef name="sqlscriptpreprocessor"
             classname="com.etretatlogiciels.ant.task.SqlScriptPreprocessor"
             classpath="${basedir}/lib/ant-tasks/sqlscriptpreprocessor.jar" />
    <sqlscriptpreprocessor inputfilepath="${basedir}/extras/blackpearl.sql.in"
                          outputfilepath="${basedir}/extras/blackpearl.sql" />
</target>

Я не понимаю, почему моя настраиваемая задача должна быть определена в целевом элементе, который ее использует, но это нормально. Я не уверен, что это сделано так изящно, как могло бы быть, но теперь это работает.

Мне жаль, что я ответил на свой вопрос; это случалось раньше или два раза, и мне кажется, что я немного хромаю. Я просто надеюсь, что это поможет кому-то другому.

Спасибо за ответы на все темы, связанные с этой темой, на всех форумах и сообщениях, которые я прочитал за последние два дня.

Ответ 2

Добавление следующей строки в файле сборки решило проблему:

<taskdef resource="net/sf/antcontrib/antlib.xml" />