scala playframework salat scalap

¿Por qué necesito el compilador Scala en tiempo de ejecución?(Play2/Salat con dependencia de Scalap)



playframework (2)

Estoy usando Scala / Mongo / Casbah / Salat / Play2 y cuando intento usar Salat parece que tiene una dependencia de Scalap.

Funciona bien al ejecutar la aplicación con play run pero con play start obtengo la siguiente pila:

[info] application - Can''t create user java.lang.NoClassDefFoundError: scala/tools/nsc/util/ClassPath$JavaContext at scala.tools.scalap.scalax.rules.scalasig.ScalaSigParser$.scalaSigFromAttribute(ScalaSig.scala:35) ~[scalap-2.9.1.jar:na] at scala.tools.scalap.scalax.rules.scalasig.ScalaSigParser$.parse(ScalaSig.scala:38) ~[scalap-2.9.1.jar:na] at com.novus.salat.util.ScalaSigUtil$$anonfun$parseScalaSig0$2.apply(ScalaSigUtil.scala:73) ~[salat-util_2.9.1-0.0.8-SNAPSHOT.jar:0.0.8-SNAPSHOT] at com.novus.salat.util.ScalaSigUtil$$anonfun$parseScalaSig0$2.apply(ScalaSigUtil.scala:73) ~[salat-util_2.9.1-0.0.8-SNAPSHOT.jar:0.0.8-SNAPSHOT] at scala.Option.map(Option.scala:133) ~[scala-library.jar:na] at com.novus.salat.util.ScalaSigUtil$.parseScalaSig0(ScalaSigUtil.scala:73) ~[salat-util_2.9.1-0.0.8-SNAPSHOT.jar:0.0.8-SNAPSHOT] Caused by: java.lang.ClassNotFoundException: scala.tools.nsc.util.ClassPath$JavaContext at java.net.URLClassLoader$1.run(URLClassLoader.java:366) ~[na:1.7.0_01] at java.net.URLClassLoader$1.run(URLClassLoader.java:355) ~[na:1.7.0_01] at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_01] at java.net.URLClassLoader.findClass(URLClassLoader.java:354) ~[na:1.7.0_01] at java.lang.ClassLoader.loadClass(ClassLoader.java:423) ~[na:1.7.0_01] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) ~[na:1.7.0_01]

scala/tools/nsc/util/ClassPath$JavaContext está en el proyecto del compilador de Scala, así que agregué la dependencia de SBT:

"org.scala-lang" % "scala-compiler" % "2.9.1"

Ahora funciona bien con play start también.

Pero, ¿es normal tener que ejecutar mi proyecto con una dependencia de tiempo de ejecución para el compilador scala? ¿Y por qué funciona con play run sin la dependencia del compilador scala? ¿Se incrusta automáticamente cuando no se ejecuta en modo de producción?

Gracias


Esto sucede por dos razones:

  • Si está trabajando en modo dev, sus clases se vuelven a compilar continuamente. Entonces necesitas un compilador

  • Si usa el modo de escenario, las clases se compilan una vez para siempre, pero esto se hace internamente. De lo contrario, debería proporcionar una referencia al compilador scala, que podría reemplazar la dependencia del compilador Scala.


En realidad, Scalap depende del compilador de Scala:

<dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> <version>2.9.0.RC4</version> </dependency> </dependencies>

http://www.jarvana.com/jarvana/inspect-pom/org/scala-lang/scalap/2.9.0.RC4/scalap-2.9.0.RC4.pom

Estaba teniendo el problema porque temporalmente mis dependencias fueron manejadas manualmente y no por SBT.

Ahora los administro SBT y funciona bien ... pero el compilador aún se recupera como una dependencia transitiva con Salat como dependencia inicial ...

Es extraño tener el compilador en tiempo de ejecución, pero funciona ...