¿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 ...