configure ant para scala
(1)
¿Cómo instalo antlib.xml para que scala funcione correctamente?
En este momento, encuentro el siguiente error cuando ejecuto ant
en un archivo build.xml que contiene tareas de scala.
[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.
He desbloqueado el scala-2.8.1.final/lib/scala-compiler.jar
pero no sé dónde colocar el contenido.
Aquí está el fragmento de código de ant correspondiente del 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>
Responder
Es importante tener el siguiente código en su archivo build.xml:
<!-- 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>
Mi problema fue que la variable de entorno $SCALA_HOME
( ${env.SCALA_HOME}
) estaba apuntando al lugar equivocado (un nivel demasiado profundo: /usr/local/scala-2.8.1.final/bin/
lugar de solo /usr/local/scala-2.8.1.final/
, y por lo tanto no se pudo encontrar el directorio lib
.
El archivo antlib.xml está contenido en scala-compiler.jar. Tienes que ponerlo en tu classpath. Para definir la tarea ant de scalac
, coloque la siguiente definición en su archivo de compilación ant (esto se toma de 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>
Para usar la tarea de scalac
, agregue el atributo depends="init"
a su tarea, por ejemplo
<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>
Espero que eso ayude.