Note that there are some explanatory texts on larger screens.

plurals
  1. POAdding dependency on scala-async to the project written on scala play 2 + slick
    primarykey
    data
    text
    <p>I am writing a web application using scala play 2 + slick. I also want to use akka + scala-async. After adding dependency on <em>scala-async</em> to my project and running the application from the <strong>play-console (using the "run" command)</strong> my application <strong>fails</strong> to build. However, when I <strong>use the "dist" command and run the web site</strong>, everything works <strong>fine</strong>. I know that this problem is somehow connected with scala-async using <strong>macros</strong>. </p> <p>When building with "run" command I get the following exception:</p> <pre><code>play.api.UnexpectedException: Unexpected exception[NoSuchMethodException: slick. tables.Requests$.&lt;init&gt;()] at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anon fun$1.apply(ApplicationProvider.scala:148) ~[play_2.10-2.2.1.jar:2.2.1] at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anon fun$1.apply(ApplicationProvider.scala:112) ~[play_2.10-2.2.1.jar:2.2.1] at scala.Option.map(Option.scala:145) ~[scala-library-2.10.3.jar:na] at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply (ApplicationProvider.scala:112) ~[play_2.10-2.2.1.jar:2.2.1] at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply (ApplicationProvider.scala:110) ~[play_2.10-2.2.1.jar:2.2.1] at scala.util.Success.flatMap(Try.scala:200) ~[scala-library-2.10.3.jar: na] Caused by: java.lang.NoSuchMethodException: slick.tables.Requests$.&lt;init&gt;() at java.lang.Class.getConstructor0(Class.java:2800) ~[na:1.7.0_40] at java.lang.Class.getConstructor(Class.java:1708) ~[na:1.7.0_40] at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$constructorToJa va$1.apply(JavaMirrors.scala:1242) ~[scala-reflect-2.10.3.jar:na] at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$constructorToJa va$1.apply(JavaMirrors.scala:1236) ~[scala-reflect-2.10.3.jar:na] at scala.reflect.runtime.TwoWayCache.toJava(TwoWayCache.scala:49) ~[scal a-reflect-2.10.3.jar:na] at scala.reflect.runtime.JavaMirrors$JavaMirror.constructorToJava(JavaMi rrors.scala:1236) ~[scala-reflect-2.10.3.jar:na] </code></pre> <p><strong>How do I make it work?</strong></p> <p><strong>EDIT:</strong></p> <p>I know that this problem is somehow connected with <em>scala-async</em> using <strong>macros</strong>, because the same error appears when I try to use my macro to generate <em>forInsert</em> statements in my slick tables without adding dependency on <em>scala-async</em>. </p> <p>There is another interesting thing I've found out recently. <strong>If I use <em>class</em> instead of <em>object</em> to describe my slick tables the error disappears.</strong> Although in this case the play framework starts an endless recompilation cycle when I use my macro.</p> <p><strong>EDIT:</strong></p> <p>Here is my Buid.scala</p> <pre><code>import sbt._ import Keys._ import Defaults.defaultSettings import org.scalastyle.sbt.ScalastylePlugin.{Settings =&gt; scalastyleSettings} import play.Project.playScalaSettings import net.virtualvoid.sbt.graph.Plugin.graphSettings object Resolvers { val typesafe = Resolver.typesafeRepo("releases") val sonatype = Resolver.sonatypeRepo("releases") } import Resolvers._ object Dependencies { val scalatest = "org.scalatest" %% "scalatest" % "1.9.2" % "test" val scalamock = "org.scalamock" %% "scalamock-scalatest-support" % "3.0.1" % "test" val scalaz = "org.scalaz" %% "scalaz-core" % "7.0.4" val akka = "com.typesafe.akka" %% "akka-actor" % "2.2.3" val slickorm = "com.typesafe.slick" %% "slick" % "1.0.1" val scalacheck = "org.scalacheck" %% "scalacheck" % "1.10.1" % "test" val webjarsPlay = "org.webjars" %% "webjars-play" % "2.2.0" val underscorejs = "org.webjars" % "underscorejs" % "1.5.1" val jquery = "org.webjars" % "jquery" % "2.0.3-1" val angularjs = "org.webjars" % "angularjs" % "1.2.0-rc.3" val angularui = "org.webjars" % "angular-ui-bootstrap" % "0.6.0-1" val bootstrap = "org.webjars" % "bootstrap" % "2.3.2" exclude("org.webjars", "jquery") val requirejs = "org.webjars" % "requirejs" % "2.1.8" val playSlick = "com.typesafe.play" %% "play-slick" % "0.5.0.8" val logback = "ch.qos.logback" % "logback-classic" % "1.0.13" val postgresql = "postgresql" % "postgresql" % "9.1-901.jdbc4" val nscalaTime = "com.github.nscala-time" %% "nscala-time" % "0.6.0" val scalaAsync = "org.scala-lang.modules" %% "scala-async" % "0.9.0-M4" } import Dependencies._ object BankSettings { val bankSettings = Seq( organization := "org.zeka", version := "0.0.0-SNAPSHOT", scalaVersion := "2.10.3", scalacOptions := Seq( "-optimise", "-deprecation", "-unchecked", "-feature", "-g:vars", "-target:jvm-1.7", "-encoding", "UTF-8", "-language:postfixOps" ), resolvers ++= Seq( typesafe, sonatype ) ) } import BankSettings._ object BankBuild extends Build { lazy val bank = Project( "bank", file ("."), settings = defaultSettings ++ scalastyleSettings ++ graphSettings ++ playScalaSettings ++ bankSettings ++ Seq( libraryDependencies ++= Seq( scalatest, scalamock, scalaz, akka, logback, playSlick, webjarsPlay, bootstrap, angularjs, angularui ) ) ) dependsOn (common, logick, slick) aggregate (common, logick, slick) lazy val common = Project( "common", file ("modules/common"), settings = defaultSettings ++ scalastyleSettings ++ graphSettings ++ bankSettings ++ Seq( libraryDependencies ++= Seq( scalatest, scalamock, nscalaTime ) ) ) lazy val logick = Project( "logic", file ("modules/logic"), settings = defaultSettings ++ scalastyleSettings ++ graphSettings ++ bankSettings ++ Seq( libraryDependencies ++= Seq( scalatest, scalamock, akka, scalaAsync ) ) ) dependsOn (common, slick) lazy val slick = Project( "slick", file ("modules/slick"), settings = defaultSettings ++ scalastyleSettings ++ graphSettings ++ bankSettings ++ Seq( libraryDependencies ++= Seq( scalatest, scalamock, akka, slickorm, postgresql ) ) ) dependsOn common } </code></pre> <p><strong>EDIT:</strong></p> <p>Here is my macro.</p> <pre><code>package slick import scala.language.experimental.macros import scala.reflect.macros.Context import scala.slick.driver.PostgresDriver.simple._ import scala.slick.lifted.ColumnBase import scala.reflect.api.Liftable._ object SlickMacro { def *[T]: ColumnBase[T] = macro starImpl[T] def starImpl[T: c.WeakTypeTag](c: Context): c.Expr[ColumnBase[T]] = { import c.universe._ val tpe = weakTypeOf[T] if (!tpe.typeSymbol.asClass.isCaseClass) { c.abort(c.enclosingPosition, "not a case class") } else { val companion = tpe.typeSymbol.companionSymbol val params = tpe.declarations.collectFirst { case m: MethodSymbol if m.isPrimaryConstructor =&gt; m }.get.paramss.head def build(params: List[Symbol], acc: Tree): Tree = params match { case Nil =&gt; acc case h :: t =&gt; build(t, q"$acc ~ ${h.name}") } c.Expr[ColumnBase[T]] { q"${build(params.tail, q"id.?")} &lt;&gt; ($companion, $companion.unapply _)" } } } def forInsert[T]: ColumnBase[T] = macro forInsertImpl[T] def forInsertImpl[T: c.WeakTypeTag](c: Context): c.Expr[ColumnBase[T]] = { import c.universe._ val tpe = weakTypeOf[T] if (!tpe.typeSymbol.asClass.isCaseClass) { c.abort(c.enclosingPosition, "not a case class") } else { val companion = tpe.typeSymbol.companionSymbol val params = tpe.declarations.collectFirst { case m: MethodSymbol if m.isPrimaryConstructor =&gt; m }.get.paramss.head def build(params: List[Symbol], acc: Tree): Tree = params match { case Nil =&gt; acc case h :: t =&gt; build(t, q"$acc ~ ${h.name}") } val paramsTail = params.tail def l1 = (1 to paramsTail.size).map(i =&gt; q"x.${newTermName("_" + i)}") def l2 = (2 to params.size).map(i =&gt; q"x.${newTermName("_" + i)}") c.Expr[ColumnBase[T]] { q"${build(paramsTail.tail, q"${paramsTail.head.name}")} &lt;&gt; ({ x =&gt; $companion(None, ..$l1) }, { (u: $tpe) =&gt; $companion.unapply(u).map(x =&gt; (..$l2)) })" } } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload