Wie MySQL JDBC-Treiber in einem SBT Scala-Projekt verwenden?
Frage
Wenn ich mein Projekt zum ersten Mal während einer SBT-Sitzung ausgeführt wird, wirft es die folgende Ausnahme, wenn sie Zugriff auf eine MySQL-Datenbank versuchen:
java.lang.NoClassDefFoundError: scala / Bestellen
Wenn ich es noch einmal (und jederzeit, nachdem er während der gleichen Sitzung SBT) laufen, wirft es ein anderes:
java.sql.SQLException: Kein passender Treiber gefunden für jdbc: mysql: // localhost / ...
Als ich NetBeans wurde mit dem gleichen Code arbeitet Ok. Jetzt, da ich SBT verwenden für den Bau und Kate zu bearbeiten und verwalten mein Projekt manuell, ich diese Laufzeitfehler erhalten.
MySQL JDBC-Treiber (heruntergeladen rechts von MySQL.com) JAR ist in lib des Projekts und alle anderen Bibliotheken Ich habe dort Arbeit ok setzen.
Hier ist der Code:
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
Ich habe eine Frage gesehen das sieht ziemlich verwandt, aber noch keine Antwort.
Lösung
In der SBT Projektklasse sollte es eine Linie sein:
// Declare MySQL connector Dependency
val mysql = "mysql" % "mysql-connector-java" % "5.1.12"
Dies wird die JDBC-Treiber-JAR-Datei für MySQL importieren.
Haben laden Sie den Treiber? Wenn Sie diese Util-Klasse verwenden, um die Verbindungen zu holen, wird der Treiber geladen genau einmal:
// 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
}
}
}
}
Der Code wird von einem einfachen SBT genommen - MySQL Tutorial ich vor einiger Zeit schrieb. Wenn Sie die komplette Tutorial herunterladen möchten, finden Sie unter http://github.com/ollekullberg/SimpleOrder
Andere Tipps
Im Projekt / plugins.sbt Datei fügen Sie eine Zeile
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.12"
Dann, wenn Ihr in der sbt Shell, es neu zu starten.
Die MySQL-Abhängigkeit müssen in Ihrem build.sbt
konfiguriert werden. Derzeit ist die Stilbibliothek Abhängigkeiten zu erklären, wie so:
libraryDependencies ++= {
val liftVersion = "2.5.1"
Seq(
"net.liftweb" %% "lift-webkit" % liftVersion % "compile",
"net.liftweb" %% "lift-mapper" % liftVersion % "compile",
//etc
)
}
Fügen Sie die folgende in der Seq
mysql hinzufügen:
"mysql" % "mysql-connector-java" % "5.1.+"
Beachten Sie, dass der +
bedeutet, dass es die letzte kleinere Version erhalten wird; alles, was über 5.1
, wie 5.1.27
(die aktuelle Version zum Zeitpunkt des Schreibens).