使用 UCanAccess / jackcess 作为 JDBC 到 MS Acess 数据库时出现 IncompatibleClassChangeError

Posted

技术标签:

【中文标题】使用 UCanAccess / jackcess 作为 JDBC 到 MS Acess 数据库时出现 IncompatibleClassChangeError【英文标题】:IncompatibleClassChangeError when using UCanAccess / jackcess as a JDBC to MS Acess database 【发布时间】:2014-08-15 23:11:11 【问题描述】:

我正在尝试使用 UCanAccess 从 Mac OSX.8 中的 MS Access 数据库中读取数据。我相信我已经按照UCanAccess directions 和Gord Tompson in a *** answer 提供的设置了一切。这是我得到的错误:

线程“主”java.lang.IncompatibleClassChangeError 中的异常:找到 com.healthmarketscience.jackcess.Database 类,但需要接口

在 net.ucanaccess.jdbc.DBReference.(DBReference.java:149) 在 net.ucanaccess.jdbc.DBReferenceSingleton.loadReference(DBReferenceSingleton.java:57) 在 net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:100) 在 java.sql.DriverManager.getConnection(DriverManager.java:582) 在 java.sql.DriverManager.getConnection(DriverManager.java:207) 在 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】:

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

【讨论】:

jackcess 是 2.0.4,这是最新版本。 1.1.1 是公共日志记录。只是为了确保我会尝试用来自他们自己站点的 jackcess 替换 ucanaccess 附带的 jackcess 版本。但我不抱希望。 是的,您不必替换正确的 jackcess jar (2.0.4),而是从类路径中删除错误的。你得到的异常不可能是其他原因,你的类路径中有另一个 jackcess 1.x.x jar 或者你的环境中有一些脏东西。 我找到了旧的 jackcess (1.2.14.3),GDAL 框架正在使用它来安装我的 QGIS。我现在正试图弄清楚如何从 Eclipse 的 JRE 库中删除它。我似乎只能完全切换库,但我没有另一个可以与 ucanaccess 一起使用的库。你有什么进一步的建议吗? 我能够通过创建一个新的 JRE 系统库从类路径中删除旧的 jackcess,但它仍然给出了同样的错误。我能够解决此问题的唯一方法是手动从其文件夹中删除旧文件。 在你的构建路径中,你需要你提到的 jars 和一个干净的 JRE(你可以从官方来源下载)。也许 QGIS 安装部分不应该与其他类型的项目共享。

以上是关于使用 UCanAccess / jackcess 作为 JDBC 到 MS Acess 数据库时出现 IncompatibleClassChangeError的主要内容,如果未能解决你的问题,请参考以下文章

jdbc/Jackcess/Ucanaccess - 无法连接到链接到共享点列表的访问表

使用 iso-8859-1 在 wildfly 中打开 ucanaccess/jackcess 数据库

使用 UCanAccess / jackcess 作为 JDBC 到 MS Acess 数据库时出现 IncompatibleClassChangeError

当 Jackcess 连接正常时,UCanAccess 驱动程序在尝试连接 Access 数据库时抛出异常

Java NoSuchMethodError:com.healthmarketscience.jackcess.Table.isAllowAutoNumberInsert() [重复]

使用 UCanAccess 创建表后,ms 访问未强制执行非空约束