Raxkin
Raxkin

Reputation: 397

play.api.UnexpectedException: Unexpected exception[NoClassDefFoundError: slick/backend/DatabaseConfig]

I'm tring to setup a project with play framework and postgres with slick-codegen. My project is compiling without errors And the Tables class generated is correct. But when I run the project it give me the play.api.UnexpectedException: Unexpected exception[NoClassDefFoundError: slick/backend/DatabaseConfig]. This is the full trace:

play.api.UnexpectedException: Unexpected exception[NoClassDefFoundError: slick/backend/DatabaseConfig]
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:184)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:131)
    at scala.Option.map(Option.scala:146)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:131)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:129)
    at scala.util.Success.flatMap(Try.scala:231)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:129)
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:121)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
Caused by: java.lang.NoClassDefFoundError: slick/backend/DatabaseConfig
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethods(Class.java:1975)
    at com.google.inject.spi.InjectionPoint.getInjectionPoints(InjectionPoint.java:688)
    at com.google.inject.spi.InjectionPoint.forInstanceMethodsAndFields(InjectionPoint.java:380)
    at com.google.inject.internal.ConstructorBindingImpl.getInternalDependencies(ConstructorBindingImpl.java:165)
    at com.google.inject.internal.InjectorImpl.getInternalDependencies(InjectorImpl.java:616)
    at com.google.inject.internal.InjectorImpl.cleanup(InjectorImpl.java:572)
    at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:558)
    at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:887)
Caused by: java.lang.ClassNotFoundException: slick.backend.DatabaseConfig
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethods(Class.java:1975)
    at com.google.inject.spi.InjectionPoint.getInjectionPoints(InjectionPoint.java:688)
    at com.google.inject.spi.InjectionPoint.forInstanceMethodsAndFields(InjectionPoint.java:380)
    at com.google.inject.internal.ConstructorBindingImpl.getInternalDependencies(ConstructorBindingImpl.java:165)
    at com.google.inject.internal.InjectorImpl.getInternalDependencies(InjectorImpl.java:616)

I have my project split in 2 subprojects. The Play project and the codegen project that is used to generate the Tables class.

My build.sbt looks like this:

import sbt.Keys._

val slickVersion = "3.2.0"


scalaVersion := "2.11.8"

// The Play project itself
lazy val root = (project in file("."))
  .settings(
    libraryDependencies ++= List(
      "com.netaporter" %% "scala-uri" % "0.4.14",
      "net.codingwell" %% "scala-guice" % "4.1.0",
      "com.typesafe.play" %% "play-slick" % "2.0.2",
      "com.typesafe.play" %% "play-slick-evolutions" % "2.0.2"
    )
  )
  .settings(sharedSettings)
  .enablePlugins(Common, PlayScala)
  .settings(
    name := """Play app"""
  )
  .dependsOn(codegen)


lazy val codegen = project
  .settings(sharedSettings)
  .settings(
    libraryDependencies ++= List(
      "com.typesafe.slick" %% "slick-codegen" % slickVersion
    )
  )


lazy val sharedSettings = Seq(
  scalaVersion := "2.11.8",
  scalacOptions := Seq("-feature", "-unchecked", "-deprecation"),
  libraryDependencies ++= List(
    "com.typesafe.scala-logging" %% "scala-logging-slf4j" % "2.1.2",
    "org.slf4j" % "slf4j-api" % "1.7.23",
    "org.slf4j" % "log4j-over-slf4j" % "1.7.23",  // for any java classes looking for this
    "ch.qos.logback" % "logback-classic" % "1.2.1",

    "com.typesafe.slick" %% "slick" % slickVersion,
    "org.postgresql" % "postgresql" % "9.4.1212",
    "com.github.tminglei" %% "slick-pg" % "0.15.0-RC",
    "com.github.tminglei" %% "slick-pg_play-json" % "0.15.0-RC",
    "com.github.tminglei" %% "slick-pg_joda-time" % "0.15.0-RC",
    "com.github.tminglei" %% "slick-pg_jts" % "0.15.0-RC",
    "joda-time" % "joda-time" % "2.9.7",
    "org.joda" % "joda-convert" % "1.8"
  )
)

I also tried removing all the code that use database and the Tables class but i still get this error.

I use a custom postgres driver and it is in the codegen project but is i add the dependsOn(codegen) in the root project, it should not be a problem. Also it is compling without problems with sbt compile.

EDIT: After some testings, i changed the slick version to 3.1.1 and com.github.tminglei versions to 0.14.3 and it now works for me.

Upvotes: 1

Views: 1660

Answers (1)

raisercostin
raisercostin

Reputation: 9189

I had the same classapth problem and in the end used the following versions in a play-2.5.x and scala-2.11 project:

libraryDependencies ++= List(
    "com.typesafe.play" %% "play-slick" % "2.1.0",
    "com.typesafe.play" %% "play-slick-evolutions" % "2.1.0",
    "com.typesafe.slick" %% "slick" % "3.2.0",
    "com.github.tototoshi" %% "slick-joda-mapper" % "2.3.0"
}

The slick.backend.DatabaseConfig comes from slick-3.1.0 that was needed by play-slick-2.0.2. Since you wanted slick-3.2.0 you need to use play-slick-2.1.0 see https://github.com/playframework/play-slick and https://github.com/tototoshi/slick-joda-mapper .

Upvotes: 1

Related Questions