35

当我在 SBT 会话期间第一次运行我的项目时,它会在尝试访问 MySQL 数据库时引发以下异常:

java.lang.NoClassDefFoundError: scala/Ordered

当我再次运行它时(以及在它之后的任何时间,在同一个 SBT 会话期间),它会抛出一个不同的:

java.sql.SQLException:找不到适合 jdbc 的驱动程序:mysql://localhost/...

当我使用 NetBeans 时,相同的代码运行正常。现在,当我使用 SBT 进行构建和 Kate 手动编辑和管理我的项目时,我得到了这些运行时错误。

MySQL JDBC 驱动程序(直接从 MySQL.com 下载) JAR 位于项目的 lib 目录中,我放在那里的所有其他库都可以正常工作。

这是代码:

import java.sql._
...
// read
val dbc : Connection = DriverManager.getConnection("jdbc:mysql://localhost/...")
val st : Statement = dbc.createStatement
val rs : ResultSet = st.executeQuery("SELECT ...")
if(rs.first) result = rs.getDouble("field")
dbc.close
...
// write
val dbc : Connection = DriverManager.getConnection("jdbc:mysql://localhost/...")
val st : Statement = dbc.createStatement
st.execute("UPDATE ...")
dbc.close

我看过一个看起来很相关的问题,但仍然没有答案。

4

3 回答 3

30

在 SBT 项目类中应该有一行:

 // Declare MySQL connector Dependency
  val mysql = "mysql" % "mysql-connector-java" % "5.1.12"

这将为 MySQL 导入 JDBC 驱动程序 JAR 文件。

你加载驱动了吗?如果您使用此 Util 类来获取连接,驱动程序将被加载一次:

// Util Class
object DaoUtil {
  import java.sql.{DriverManager, Connection}

  private var driverLoaded = false

  private def loadDriver()  {
    try{
      Class.forName("com.mysql.jdbc.Driver").newInstance
      driverLoaded = true
    }catch{
      case e: Exception  => {
        println("ERROR: Driver not available: " + e.getMessage)
        throw e
      }
    }
  }

  def getConnection(dbc: DbConnection): Connection =  {
    // Only load driver first time
    this.synchronized {
      if(! driverLoaded) loadDriver()
    }

    // Get the connection
    try{
      DriverManager.getConnection(dbc.getConnectionString)
    }catch{
      case e: Exception  => {
        println("ERROR: No connection: " + e.getMessage)
        throw e
      }
    }
  }
}

代码取自我前段时间写的一个简单的 SBT - MySQL 教程。如果要下载完整的教程,请参见http://github.com/ollekullberg/SimpleOrder

于 2010-10-09T18:22:54.393 回答
16

在 project/plugins.sbt 文件中添加一行

libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.12"

然后,如果您在 sbt shell 中,请重新启动它。

于 2013-01-22T11:44:12.333 回答
2

MySQL 依赖项必须在您的build.sbt. 目前的风格是像这样声明库依赖项:

libraryDependencies ++= {
  val liftVersion = "2.5.1"
  Seq(
    "net.liftweb"       %% "lift-webkit"        % liftVersion        % "compile",
    "net.liftweb"       %% "lift-mapper"        % liftVersion        % "compile",
    //etc
  )
}

在里面添加以下内容Seq来添加mysql:

"mysql" % "mysql-connector-java" % "5.1.+"

请注意,这+意味着它将获得最新的次要版本;以上任何内容5.1,例如5.1.27(撰写本文时的当前版本)。

于 2013-12-16T23:26:11.150 回答