2010-10-09 3 views
25

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

java.lang.NoClassDefFoundError: scala/Ordered

Когда я запустить его снова (и в любое время после этого, во время На этой же сессии SBT), он бросает другой один:

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/...

Когда я использую NetBeans, тот же код работает ОК. Теперь, когда я использую SBT для создания и Kate для редактирования и управления моим проектом вручную, я получаю эти ошибки во время выполнения.

Драйвер JDBC MySQL (загружаемый прямо с сайта 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 

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

ответ

25

В классе проекта 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

+1

Если у вас такая же проблема, это исправление! – Albert

+0

такая же проблема, и это исправление не работает – wedens

11

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

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

Тогда, если ваш в SBT оболочки, перезапустить его.

1

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

Смежные вопросы