Как использовать драйвер 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
Я видел вопрос который выглядит довольно связанным, но ответа пока нет.
Ответы
Ответ 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
(текущая версия на момент написания).