Cómo utilizar MySQL controlador JDBC en un proyecto de SBT Scala?
Pregunta
Cuando ejecuto mi proyecto por primera vez durante una sesión de SBT, que arroja la siguiente excepción cuando se trata de acceder a una base de datos MySQL:
java.lang.NoClassDefFoundError: Scala / ordenada
Cuando corro de nuevo (y en cualquier momento después de que, durante la misma sesión SBT), que arroja una diferente:
java.sql.SQLException: No se encontró controlador adecuado para JDBC: mysql: // localhost / ...
Cuando yo estaba usando NetBeans, el mismo código trabajaba Ok. Ahora, como yo uso para la construcción de SBT y Kate para editar y administrar mi proyecto manualmente, consigo estos errores de ejecución.
MySQL JDBC (descargado desde MySQL.com) JAR está en el directorio lib del proyecto y todas las otras bibliotecas que he puesto ahí bien el trabajo.
Este es el código:
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
he visto un pregunta que se ve bastante relacionados, pero aún no hay respuesta.
Solución
En la clase de proyecto SBT no debería ser una línea:
// Declare MySQL connector Dependency
val mysql = "mysql" % "mysql-connector-java" % "5.1.12"
Esto importará el archivo JAR del controlador JDBC para MySQL.
¿Se cargó el conductor? Si utiliza esta clase Util a buscar las conexiones, el conductor se cargará exactamente una vez:
// 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
}
}
}
}
El código se toma de un simple SBT - MySQL tutorial que escribí hace algún tiempo. Si desea descargar el tutorial completo, consulte http://github.com/ollekullberg/SimpleOrder
Otros consejos
En el archivo de proyecto / plugins.sbt añadir una línea
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.12"
A continuación, si estás en la cáscara SBT, reiniciarlo.
La dependencia MySQL debe configurarse en su build.sbt
. Actualmente el estilo es declarar las dependencias de bibliotecas, así:
libraryDependencies ++= {
val liftVersion = "2.5.1"
Seq(
"net.liftweb" %% "lift-webkit" % liftVersion % "compile",
"net.liftweb" %% "lift-mapper" % liftVersion % "compile",
//etc
)
}
Añadir la siguiente dentro de la Seq
añadir MySQL:
"mysql" % "mysql-connector-java" % "5.1.+"
Tenga en cuenta que los medios +
que va a conseguir la última versión de menor importancia; cualquier cosa por encima 5.1
, como 5.1.27
(la versión actual en el momento de la escritura).