尝试添加 MySQL / slick 后出现奇怪的 Play Framework 2.2 异常

Posted

技术标签:

【中文标题】尝试添加 MySQL / slick 后出现奇怪的 Play Framework 2.2 异常【英文标题】:Strange Play Framework 2.2 exceptions after trying to add MySQL / slick 【发布时间】:2013-10-24 04:29:56 【问题描述】:

我正在开发一个 Play 2.2 应用程序,但自从我尝试添加我的 DB 层后,我的情况有些不对劲。

以下是我的build.sbt 依赖项。如您所见,我使用mysql-connector-javaplay-slick

libraryDependencies ++= Seq(
  jdbc,
  anorm,
  cache,
  "joda-time" % "joda-time" % "2.3",
  "mysql" % "mysql-connector-java" % "5.1.26",
  "com.typesafe.play" %% "play-slick" % "0.5.0.8",
  "com.aetrion.flickr" % "flickrapi" % "1.1"
)

我的application.conf 中有一些类似的简单数据库内容:

db.default.url="jdbc:mysql://localhost/myDb"
db.default.driver="com.mysql.jdbc.Driver"
db.default.user="root"
db.default.pass=""

这是我的 Play 服务器启动时的样子:

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

[info] Compiling 1 Scala source to C:\bbq\cats\in\space
[info] play - database [default] connected at jdbc:mysql://localhost/myDb
[info] play - Application started (Dev)

因此,Play 似乎可以很好地连接到 MySQL 数据库(我认为)。但是,当我向我的服务器发出任何请求时,我会收到此异常:

[error] p.nettyException - Exception caught in Netty
java.lang.NoSuchMethodError: akka.actor.ActorSystem.dispatcher()Lscala/concurren
t/ExecutionContext;
        at play.core.Invoker$.<init>(Invoker.scala:24) ~[play_2.10.jar:2.2.0]
        at play.core.Invoker$.<clinit>(Invoker.scala) ~[play_2.10.jar:2.2.0]
        at play.api.libs.concurrent.Execution$Implicits$.defaultContext$lzycompu
te(Execution.scala:7) ~[play_2.10.jar:2.2.0]
        at play.api.libs.concurrent.Execution$Implicits$.defaultContext(Executio
n.scala:6) ~[play_2.10.jar:2.2.0]
        at play.api.libs.concurrent.Execution$.<init>(Execution.scala:10) ~[play
_2.10.jar:2.2.0]
        at play.api.libs.concurrent.Execution$.<clinit>(Execution.scala) ~[play_
2.10.jar:2.2.0]

奇怪的是,第二个请求(对完全相同的 URL、相同的控制器、没有更改)返回一个不同的错误:

[error] p.nettyException - Exception caught in Netty
java.lang.NoClassDefFoundError: Could not initialize class play.api.libs.concurr
ent.Execution$
        at play.core.server.netty.PlayDefaultUpstreamHandler.handleAction$1(Play
DefaultUpstreamHandler.scala:194) ~[play_2.10.jar:2.2.0]
        at play.core.server.netty.PlayDefaultUpstreamHandler.messageReceived(Pla
yDefaultUpstreamHandler.scala:169) ~[play_2.10.jar:2.2.0]
        at com.typesafe.netty.http.pipelining.HttpPipeliningHandler.messageRecei
ved(HttpPipeliningHandler.java:62) ~[netty-http-pipelining.jar:na]
        at org.jboss.netty.handler.codec.http.HttpContentDecoder.messageReceived
(HttpContentDecoder.java:108) ~[netty-3.6.5.Final.jar:na]
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:29
6) ~[netty-3.6.5.Final.jar:na]
        at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessage
Received(FrameDecoder.java:459) ~[netty-3.6.5.Final.jar:na]

我请求的 URL/控制器只是呈现一个静态网页,并没有做任何有意义的事情。在我开始添加我的数据库层之前它工作得很好。 I'm rather stuck. 任何帮助将不胜感激,谢谢。

我正在使用 Scala 2.10.2、Play 2.2.0 和 MySQL Server 5.6.14.0(社区版)。

【问题讨论】:

您使用的是哪个 Scala 版本?应该是 2.10.2 我使用的是 Scala 2.10.2:Welcome to Scala version 2.10.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_4 5). 看起来像是某种版本不兼容,例如,如果某些库会引入较旧的 akka 版本,但您的依赖项列表看起来没有。 第二个错误是 Java 主义,因为在静态块中存在异常。无论如何,那部分是红鲱鱼。 【参考方案1】:

好吧,我终于想通了。我觉得有点傻,但我会在这里发布,因为它可能对其他人有用:

在我项目的早期工作中,我正在尝试使用其他潜在的库来处理各种事情:Mongo、BSON 转换器等。当然,在试验时,我将它们添加到我的 IDE 的项目库依赖项中(我正在使用 IntelliJ想法 12)。自然,IntelliJ 正在下载 JAR 并将它们放入我项目的 lib 目录中。但是,在确定了我想要使用的库并从我的项目依赖项中删除了不必要的库之后,IntelliJ 没有从我的项目的 lib 目录中删除/清除未使用的 JAR。这导致那里有一大堆不必要的 JAR,其中一些可能与 SBT 库冲突。

简而言之:我清理了我的 Play 项目的 lib 目录,在 IDE 中仔细检查了我的项目的库依赖项,然后只重新导入了我真正需要的 JAR。

【讨论】:

看起来依赖项有问题?我有同样的问题,我就是想不通。

以上是关于尝试添加 MySQL / slick 后出现奇怪的 Play Framework 2.2 异常的主要内容,如果未能解决你的问题,请参考以下文章

MySql 重启后:#1452 - 无法添加或更新子行:外键约束失败

Mysql play-slick 连接超时错误

React-Slick 在不应该时将内容包装在 div 中

无法使用 play-slick 1.0.1/slick 3.0 连接到 mysql 数据库:配置错误

浅谈Slick- Slick101:第一个动手尝试的项目

如何使用 slick 创建数据库