configure ant for scala

ant, scala

Solution

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.

Problem

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.

Original source