How do I install the antlib.xml for scala to get ant working?
Right now I encounter the following error when I run ant
on a build.xml file that contains scala tasks.
[taskdef] Could not load definitions from resource scala/tools/ant/antlib.xml. It could not be found.
/scalala/scalala-read-only/scalala/build.xml:36: Problem: failed to create task or type scalac
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.
I have unjarred the scala-2.8.1.final/lib/scala-compiler.jar
but I don't know where to put the contents.
Here is the corresponding ant code snippet from the build.xml:
<target name="compile" depends="">
<mkdir dir="${build.dir}"/>
<scalac srcdir="${src.dir}" destdir="${build.dir}"
classpathref="project.classpath" force="changed">
<!-- addparams="-Yclosure-elim -optimise" -->
<include name="**/*.scala"/>
</scalac>
</target>
Answer
The following code is important to have in your build.xml file:
<!-- Define project CLASSPATH. -->
<path id="project.classpath">
<pathelement location="${build.dir}" />
<fileset dir="${env.SCALA_HOME}/lib/"> <include name="*.jar" /> </fileset>
<fileset dir="${lib.dir}"> <include name="*.jar" /> </fileset>
</path>
<!-- Define scala compiler, scaladoc, etc command -->
<taskdef resource="scala/tools/ant/antlib.xml">
<classpath>
<pathelement location="${env.SCALA_HOME}/lib/scala-compiler.jar" />
<pathelement location="${env.SCALA_HOME}/lib/scala-library.jar" />
</classpath>
</taskdef>
My problem was that the $SCALA_HOME
environment variable (${env.SCALA_HOME}
) was pointing to the wrong place (one level too deep: /usr/local/scala-2.8.1.final/bin/
rather than just /usr/local/scala-2.8.1.final/
, and therefore the lib
directory could not be found.
To run the ant build file, open up command prompt and navigate to the folder, where the build. xml resides, and then type ant info. You could also type ant instead. Both will work,because info is the default target in the build file.
Ant builds are based on three blocks: tasks, targets and extension points. A task is a unit of work which should be performed and constitutes of small atomic steps, for example compile source code or create Javadoc. Tasks can be grouped into targets. A target can be directly invoked via Ant.
Ant provides the facility to create the classpath container which can be used later in a task. Let us understand it with the below example. In below example, we set classpath to “build. classpath” using path element. This classpath is used in the javac task of the compile target.
The antlib.xml is contained in the scala-compiler.jar. You have to put it into your classpath. To define the scalac
ant task, put the following definition into your ant build file (this is taken form http://www.scala-lang.org/node/98):
<target name="init">
<property
name="scala-library.jar"
value="${scala.home}/lib/scala-library.jar"
/>
<path id="build.classpath">
<pathelement location="${scala-library.jar}" />
<!--<pathelement location="${your.path}" />-->
<pathelement location="${build.dir}" />
</path>
<taskdef resource="scala/tools/ant/antlib.xml">
<classpath>
<pathelement location="${scala.home}/lib/scala-compiler.jar" />
<!-- NEW: For scala 2.10.2 you need scala-reflect: -->
<pathelement location="${scala.home}/lib/scala-reflect.jar" />
<pathelement location="${scala-library.jar}" />
</classpath>
</taskdef>
</target>
To use the scalac
task, add the attribute depends="init"
to your task, e.g.
<target name="compile" depends="init">
<mkdir dir="${build.dir}"/>
<scalac srcdir="${src.dir}" destdir="${build.dir}"
classpathref="project.classpath" force="changed">
<!-- addparams="-Yclosure-elim -optimise" -->
<include name="**/*.scala"/>
</scalac>
</target>
I hope, that helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With