2010-10-09 28 views
25

Khi tôi chạy dự án của tôi lần đầu tiên trong suốt một session SBT, nó ném ngoại lệ sau khi cố gắng truy cập vào một cơ sở dữ liệu MySQL:Làm thế nào để sử dụng trình điều khiển JDBC MySQL trong một dự án SBT Scala?

java.lang.NoClassDefFoundError: scala/Ordered

Khi tôi chạy nó một lần nữa (và bất cứ lúc nào sau khi nó, trong cùng một phiên SBT), nó ném một phiên khác nhau:

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

Khi tôi đang sử dụng NetBeans, cùng mã đang hoạt động Ok. Bây giờ, Khi tôi sử dụng SBT để xây dựng và Kate để chỉnh sửa và quản lý dự án của tôi theo cách thủ công, tôi nhận được các lỗi thời gian chạy này.

Trình điều khiển JDBC MySQL (được tải xuống ngay từ MySQL.com) JAR nằm trong thư mục lib của dự án và tất cả các thư viện khác mà tôi đã đặt ở đó đều hoạt động tốt.

Đây là mã:

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 

Tôi đã nhìn thấy một question trông khá liên quan, nhưng vẫn không có câu trả lời.

Trả lời

25

Trong lớp dự án SBT nên có một dòng:

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

này sẽ nhập khẩu các tập tin trình điều khiển JDBC JAR cho MySQL.

Bạn đã tải trình điều khiển chưa? Nếu bạn sử dụng lớp util này để lấy các kết nối, người lái xe sẽ được nạp chính xác một thời gian:

// 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 
     } 
    } 
    } 
} 

Mã này được lấy từ một SBT đơn giản - hướng dẫn MySQL tôi đã viết một số thời gian trước đây. Nếu bạn muốn tải về hướng dẫn hoàn chỉnh, xem http://github.com/ollekullberg/SimpleOrder

+1

Đã xảy ra sự cố tương tự, việc này sẽ khắc phục sự cố! – Albert

+0

cùng một vấn đề và sửa chữa này không hoạt động – wedens

11

Trong dự án/plugins.sbt tập thêm một dòng

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

Sau đó, nếu bạn trong vỏ SBT, khởi động lại nó.

1

Phụ thuộc MySQL phải được định cấu hình trong build.sbt của bạn. Hiện nay phong cách là để khai báo thư viện phụ thuộc như vậy:

libraryDependencies ++= { 
    val liftVersion = "2.5.1" 
    Seq(
    "net.liftweb"  %% "lift-webkit"  % liftVersion  % "compile", 
    "net.liftweb"  %% "lift-mapper"  % liftVersion  % "compile", 
    //etc 
) 
} 

Thêm dòng sau bên trong Seq thêm mysql:

"mysql" % "mysql-connector-java" % "5.1.+" 

Lưu ý rằng + có nghĩa là nó sẽ nhận được phiên bản nhỏ nhất; bất kỳ điều gì ở trên 5.1, chẳng hạn như 5.1.27 (phiên bản hiện tại tại thời điểm viết).

Các vấn đề liên quan