15
votes

(Yes, I've read and played around based on answers to similar questions in this forum and in many others such as JavaRanch--to no avail yet.)

I've created a custom ant task according to Apache doc.

Running ant, I get:

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)

This is pursuant to a target in my build.xml file:

<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>

I have ant-contrib-1.0b3.jar on the path *$ANT_HOME/lib*. I have sqlscriptpreprocessor.jar on that path, plus the local classpath for my build.

In an attempt to exorcise this problem, I've tried every combination of the following set of statements, which I've picked up all over the place via Google, meaning one of the <taskdef ant-contrib> with one of the <taskdef sqlscriptpreprocessor> constructs, two of the first with one of the latter, one of the first with two of the latter, all together, none of them, etc.

<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>

It's frustrating that it's not as easy as they say to add custom tasks to ant.

I would greatly appreciate any and all comments.

Thanks,

Russ

3

3 Answers

18
votes

I've struggled with this for two days now. The answer I appear to be getting is implied by http://ant.apache.org/manual/tutorial-writing-tasks.html:

The <taskdef name="sqlscriptpreprocessor" ...> element must be placed down inside the target that uses it, in this case, mysql-preprocess. I was not doing this. Now, I have:

<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>

I don't understand why my custom task must be defined in the target element that consumes it, but this is fine by me. I'm not certain this is couched as gracefully as it could be, but it works now.

I'm sorry for answering my own question; it's happened before once or twice and it seems pretty lame of me. I just hope it helps someone else.

Thanks for all the replies surrounding this topic in all the forums and posts I read over the last two days.

1
votes

Adding the next line in build file solved the problem:

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

For me this message:

/Users/packrd/Downloads/source/build.xml:435: The following error occurred while executing this line:
/Users/packrd/Downloads/source/build.xml:440: The following error occurred while executing this line:
/Users/packrd/Downloads/source/Documentation/docs/build.xml:221: The following error occurred while executing this line:
/Users/packrd/Downloads/source/Documentation/docs/asciidoc-macros.xml:249: Problem: failed to create task or type antlib:net.sf.antcontrib:switch
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.
No types or tasks have been defined in this namespace yet

This appears to be an antlib declaration. 
Action: Check that the implementing library exists in one of:
        -/usr/local/Cellar/ant/1.10.8/libexec/lib
        -/Users/packrd/.ant/lib
        -a directory added on the command line with the -lib argument

meant I didn't have ant-contrib installed, fix on OS X:

brew install ant-contrib