使用UCanAccess / jackcess作为JDBC到MS Access数据库时的IncompatibleClassChangeError

时间:2014-08-15 23:11:12

标签: eclipse macos jdbc jackcess ucanaccess

我正在尝试使用UCanAccess从Mac OSX.8中的MS Access数据库中读取数据。我相信我已根据UCanAccess directionsGord Tompson in a StackOverflow answer提供的内容设置了所有内容。这是我得到的错误:

  

线程中的异常" main" java.lang.IncompatibleClassChangeError:找到类com.healthmarketscience.jackcess.Database,但接口是预期的   

      at net.ucanaccess.jdbc.DBReference.(DBReference.java:149)
      at net.ucanaccess.jdbc.DBReferenceSingleton.loadReference(DBReferenceSingleton.java:57)
      at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:100)
      at java.sql.DriverManager.getConnection(DriverManager.java:582)
      at java.sql.DriverManager.getConnection(DriverManager.java:207)
      at openACCDB.OpenACCDB.main(OpenACCDB.java:13)

我的构建路径包括以下内容:

    commons-lang-2.6.jar
    commons-logging-1.1.1.jar
    hsqldb.jar
    jackcess-2.0.4.jar
    ucanaccess-2.0.8.jar
有人有建议吗?我的理解是UCanAccess和Jackcess是独立于平台的,但是我需要一些类似于MS Jet Engine的东西才能在Mac OSX中运行吗?

这是我的代码:

package openACCDB

import java.sql.*;
import java.io.File;

public class OpenACCDB {
    public static void main(String args[]) throws ClassNotFoundException, 
            SQLException {
        Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
        String database = "/Users/george/Eclipse_Files/Java/GEOA_250/MyAccess.accdb";
        if ((new File(database)).exists()) {
            Connection conn = DriverManager.getConnection("jdbc:ucanaccess://"+database);
            Statement stmt = conn.createStatement();
            ResultSet rslt = stmt.executeQuery("SELECT [name] FROM [table1]");
            while (rslt.next())
                System.out.println(rslt.getString(1));
        }
        else System.out.println("The file "+database+"\n\tdoes not exist");
    }
}

1 个答案:

答案 0 :(得分:1)

看起来你的类路径(jackcess1.x.x)中有一个旧的,有冲突的jackcess版本,除了正确的版本: com.healthmarketscience.jackcess.Database是jackcess2.0.0以来的一个接口。 你应该删除那个jackcess1 jar。