IncompileClassChangeError при использовании UCanAccess/jackcess в качестве JDBC для базы данных MS Acess

Я пытаюсь использовать UCanAccess для чтения данных из базы данных MS Access в Mac OSX.8. Я считаю, что все настроил в соответствии с указаниями UCanAccess и указаниями Горд Томпсон в ответе StackOverflow. Это ошибка, которую я получаю:

Exception in thread "main" java.lang.IncompatibleClassChangeError: Found class com.healthmarketscience.jackcess.Database, but interface was expected

      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)

My build path includes the following:

    commons-lang-2.6.jar
    commons-logging-1.1.1.jar
    hsqldb.jar
    jackcess-2.0.4.jar
    ucanaccess-2.0.8.jar
Does anyone have any advice? My understanding is that UCanAccess and Jackcess are platform independent, but do I need something in addition akin to the MS Jet Engine to run in 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");
    }
}

person thayer    schedule 15.08.2014    source источник


Ответы (1)


Похоже, у вас есть старая, конфликтующая версия jackcess в пути к классам (jackcess1.x.x), помимо правильной: com.healthmarketscience.jackcess.Database — это интерфейс, начиная с jackcess2.0.0. Вы должны удалить эту банку jackcess1.

person jamadei    schedule 16.08.2014
comment
Jackcess - 2.0.4, самая последняя версия. 1.1.1 — это журнал общих ресурсов. Чтобы быть уверенным, я попробую заменить версию jackcess, поставляемую с ucanaccess, версией jackcess с их собственного сайта. Но я не надеюсь. - person thayer; 16.08.2014
comment
Да, вам не нужно заменять правильную банку jackcess (2.0.4), но удалять неправильную из пути к классам. Не может быть другой причины исключения, которое вы получаете, у вас есть еще одна банка jackcess 1.x.x в вашем пути к классам или что-то грязное в вашей среде. - person jamadei; 16.08.2014
comment
Я нашел старый jackcess (1.2.14.3), он используется структурой GDAL для моей установки QGIS. Сейчас я пытаюсь понять, как удалить его из библиотеки JRE в Eclipse. У меня вроде есть только возможность полностью переключать библиотеки, но другой, которая будет работать с ucanaccess, у меня нет. Есть ли у вас какие-либо дополнительные советы? - person thayer; 17.08.2014
comment
Мне удалось удалить старый jackcess из пути к классу, создав новую системную библиотеку JRE, но она по-прежнему дает ту же ошибку. Единственный способ решить эту проблему — вручную удалить старый файл из папки. - person thayer; 18.08.2014
comment
В вашем пути сборки вам нужны упомянутые вами банки и очищенная JRE (вы можете загрузить из официального источника). Возможно, части установки QGIS не следует использовать совместно с другими проектами. - person jamadei; 18.08.2014