Подтвердить что ты не робот

Как использовать драйвер MySQL JDBC в проекте SBT Scala?

Когда я запускаю свой проект в первый раз во время сеанса SBT, он бросает следующее исключение при попытке доступа к базе данных MySQL:

java.lang.NoClassDefFoundError: scala/Заказ

Когда я запустил его снова (и в любое время после него, во время того же сеанса 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

Я видел вопрос который выглядит довольно связанным, но ответа пока нет.

4b9b3361

Ответ 1

В классе проекта SBT должна быть строка:

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

Это приведет к загрузке JAR файла JDBC-драйвера для MySQL.

Вы загрузили драйвер? Если вы используете этот класс 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

Ответ 2

В файле project/plugins.sbt добавьте строку

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

Затем, если вы в оболочке sbt, перезапустите его.

Ответ 3

Зависимость 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 (текущая версия на момент написания).