user1885159
user1885159

Reputation: 43

copy a file in ant based on condition

I have to copy a file if a property is set in ant target, but I always get an error for this code:

<condition property="component.is.x">
  <equals arg1="${COMPONENT_ID}" arg2="x" />
</condition>
<target name="copyschemaparamsfile" if="sql.file.present" >
  <if>
    <equals arg1="${component.is.x}" arg2="true" />
    <then>
      <copy file="${in.root}/schema/${COMPONENT_ID}-schema.sql"
            tofile="${tmp.dir}/${COMPONENT_ID}/x/schema/schema.sql" 
            failonerror="false" />
    </then>
    <else>
      <copy file="${inf.root}/schema/${COMPONENT_ID}-schema.sql"
            tofile="${tmp.dir}/${COMPONENT_ID}/${COMPONENT_ID}/schema/schema.sql" failonerror="false" />
    </else>
  </if>
</target>

Error is:

Ant could not find the task or a class this task relies upon.
This is common and has a number of causes; the usual
    solutions are to read the manual pages then download and
    install needed JAR files, or fix the build file:
     - You have misspelt 'if'.
       Fix: check your spelling.
     - The task needs an external JAR file to execute
         and this is not found at the right place in the classpath.
       Fix: check the documentation for dependencies.
       Fix: declare the task.
     - The task is an Ant optional task and the JAR file and/or libraries
         implementing the functionality were not found at the time you
         yourself built your installation of Ant from the Ant sources.
       Fix: Look in the ANT_HOME/lib for the 'ant-' JAR corresponding to the
         task and make sure it contains more than merely a META-INF/MANIFEST.MF.
         If all it contains is the manifest, then rebuild Ant with the needed
         libraries present in ${ant.home}/lib/optional/ , or alternatively,
         download a pre-built release version from apache.org
     - The build file was written for a later version of Ant
       Fix: upgrade to at least the latest release version of Ant
     - The task is not an Ant core or optional task
         and needs to be declared using <taskdef>.
     - You are attempting to use a task defined using
        <presetdef> or <macrodef> but have spelt wrong or not
       defined it at the point of use

    Remember that for JAR files to be visible to Ant tasks implemented
    in ANT_HOME/lib, the files must be in the same directory or on the
    classpath

I am always getting above error when I execute. Can someone please suggest how to check for a parameter and copy from one directory to other within an ant target?

Upvotes: 0

Views: 713

Answers (1)

kjhughes
kjhughes

Reputation: 111521

Ant <if/> is part of Ant-Contrib. To use, follow the directions on the Ant-Contrib Tasks installation page:

(1) Copy ant-contrib-0.3.jar to the lib directory of your Ant installation. If you want to use one of the tasks in your own project, add the lines

<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>

to your build file.

(2) Keep ant-contrib-0.3.jar in a separate location. You now have to tell Ant explicitly where to find it (say in /usr/share/java/lib):

<taskdef resource="net/sf/antcontrib/antcontrib.properties">
  <classpath>
    <pathelement location="/usr/share/java/lib/ant-contrib-0.3.jar"/>
  </classpath>
</taskdef>

Upvotes: 1

Related Questions