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

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

我正在尝试使用 play 框架和带有 slick-codegen 的 postgres 设置一个项目。我的项目编译没有错误并且生成的表 class 是正确的。但是当我 运行 项目时,它给了我 play.api.UnexpectedException: Unexpected exception[NoClassDefFoundError: slick/backend/DatabaseConfig]。 这是完整的跟踪:

play.api.UnexpectedException: Unexpected exception[NoClassDefFoundError: slick/backend/DatabaseConfig]
    at play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply$$anonfun.apply(DevServerStart.scala:184)
    at play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply$$anonfun.apply(DevServerStart.scala:131)
    at scala.Option.map(Option.scala:146)
    at play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply.apply(DevServerStart.scala:131)
    at play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply.apply(DevServerStart.scala:129)
    at scala.util.Success.flatMap(Try.scala:231)
    at play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get.apply(DevServerStart.scala:129)
    at play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get.apply(DevServerStart.scala:121)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1(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)

我将我的项目分成了 2 个子项目。用于生成表的 Play 项目和 codegen 项目 class.

我的 build.sbt 看起来像这样:

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"
  )
)

我也尝试删除所有使用数据库和表的代码 class 但我仍然遇到此错误。

我使用自定义的 postgres 驱动程序,它在 codegen 项目中,但是我在根项目中添加了 dependsOn(codegen),这应该不是问题。它也可以毫无问题地编译 sbt compile。

编辑: 经过一些测试后,我将 slick 版本更改为 3.1.1,将 com.github.tminglei 版本更改为 0.14.3,它现在对我有用。

我遇到了同样的类路径问题,最后在 play-2.5.xscala-2.11 项目中使用了以下版本:

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"
}

slick.backend.DatabaseConfig 来自 slick-3.1.0play-slick-2.0.2 需要它。因为你想要 slick-3.2.0 你需要使用 play-slick-2.1.0https://github.com/playframework/play-slick and https://github.com/tototoshi/slick-joda-mapper .