如何解决Java Jackcess依赖错误?

3

我想展示来自MS Access数据库的数据,我正在使用Jackcess库,但是我遇到了一个依赖错误,我不知道如何解决。以下是我的代码和错误信息:

import com.healthmarketscience.jackcess.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import java.nio.*;
import java.lang.*;
import org.apache.commons.*;
import org.apache.commons.lang3.builder.*;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;

 class Main {
     private static Logger log=Logger.getLogger(Main.class);
     public static void main(String args[]) {
         DOMConfigurator.configure("lib\\log4j.xml");
         try {

             Database d = Database.open(new File("lib\\ExTables.mdb"));
            System.out.println(d.getTable("Cliente").display());

         } catch(Exception e) {
             e.printStackTrace();
         }
     }
 }

这是我的错误:


Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/builder/CompareToBuilder
    at com.healthmarketscience.jackcess.RowId.compareTo(RowId.java:108)
    at com.healthmarketscience.jackcess.IndexData$Entry.compareTo(IndexData.java:1825)
    at com.healthmarketscience.jackcess.IndexData$Entry.compareTo(IndexData.java:1637)
    at java.util.Collections.indexedBinarySearch(Unknown Source)
    at java.util.Collections.binarySearch(Unknown Source)
    at com.healthmarketscience.jackcess.IndexData$DataPage.findEntry(IndexData.java:2347)
    at com.healthmarketscience.jackcess.IndexData.findEntryPosition(IndexData.java:709)
    at com.healthmarketscience.jackcess.IndexData.access$3100(IndexData.java:54)
    at com.healthmarketscience.jackcess.IndexData$EntryCursor.updatePosition(IndexData.java:2118)
    at com.healthmarketscience.jackcess.IndexData$EntryCursor.restorePosition(IndexData.java:2057)
    at com.healthmarketscience.jackcess.IndexData$EntryCursor.restorePosition(IndexData.java:2040)
    at com.healthmarketscience.jackcess.IndexData$EntryCursor.beforeEntry(IndexData.java:2002)
    at com.healthmarketscience.jackcess.IndexCursor.findPotentialRow(IndexCursor.java:439)
    at com.healthmarketscience.jackcess.IndexCursor.findRowByEntryImpl(IndexCursor.java:342)
    at com.healthmarketscience.jackcess.IndexCursor.findRowByEntry(IndexCursor.java:175)
    at com.healthmarketscience.jackcess.Database$DefaultTableFinder.findRow(Database.java:2239)
    at com.healthmarketscience.jackcess.Database$TableFinder.findObjectId(Database.java:2168)
    at com.healthmarketscience.jackcess.Database.readSystemCatalog(Database.java:1081)
    at com.healthmarketscience.jackcess.Database.<init>(Database.java:765)
    at com.healthmarketscience.jackcess.Database.open(Database.java:589)
    at com.healthmarketscience.jackcess.Database.open(Database.java:535)
    at com.healthmarketscience.jackcess.Database.open(Database.java:510)
    at com.healthmarketscience.jackcess.Database.open(Database.java:488)
    at com.healthmarketscience.jackcess.Database.open(Database.java:467)
    at Main.main(Main.java:19)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.builder.CompareToBuilder
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 25 more

这是我的命令行:

 C:\Programmi\Java\jre6\bin\javaw.exe -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:3280 -Dfile.encoding=Cp1252 -classpath "C:\Documents and Settings\linosa\Documenti\programmazione\workspace_java\MSAccess\bin;C:\Documents and Settings\linosa\Documenti\programmazione\workspace_java\MSAccess\lib\jackcess-1.2.5.jar;C:\Documents and Settings\linosa\Documenti\programmazione\workspace_java\MSAccess\lib\log4j-1.2.16.jar;C:\Documents and Settings\linosa\Documenti\programmazione\workspace_java\MSAccess\lib\commons-logging-1.1.1.jar;C:\Documents and Settings\linosa\Documenti\programmazione\workspace_java\MSAccess\lib\junit-4.10.jar;C:\Documents and Settings\linosa\Documenti\programmazione\commons-lang3-3.1-bin\commons-lang3-3.1\commons-lang3-3.1-tests.jar;C:\Documents and Settings\linosa\Documenti\programmazione\commons-lang3-3.1-bin\commons-lang3-3.1\commons-lang3-3.1.jar;C:\Documents and Settings\linosa\Documenti\programmazione\commons-lang3-3.1-bin\commons-lang3-3.1\commons-lang3-3.1-javadoc.jar;C:\Documents and Settings\linosa\Documenti\programmazione\commons-lang3-3.1-bin\commons-lang3-3.1\commons-lang3-3.1-sources.jar" Main

你的类路径中是否包含了所有必需的JAR文件?CompareToBuilder属于commons-lang。 - Andreas
谢谢回答,安德烈亚斯!我不确定!commons-lang在apache库中吗? - haltman
Apache有很多项目发布库。包含您的类的库名称为commons-lang-<version.jar,例如commons-lang-2.4.jar。您能发布您的类路径吗? - Andreas
请问我该如何提取它?我已经导入了最新的commons-lang3-3.1.jar。 - haltman
1
这取决于您启动应用程序的方法。如果您从命令行启动它,您可以将命令行发送给我(类似于java -cp xx.jar.. MyStartClass)。如果您从IDE启动它,IDE会生成一个命令行并启动程序。在Eclipse中,当您转到调试视图并右键单击运行进程时,您会获得命令行。选择属性,您将看到整个命令行以及有效类路径。您使用Eclipse吗? - Andreas
是的,我使用Eclipse。我在主答案中附上了我的命令行。 - haltman
2个回答

8

Commons Lang 3与2.x不兼容,您需要下载2.6版本。

您可能还想调查Maven或Ant+Ivy,以使这种依赖关系解决更加容易。


感谢artbristol!降级库解决了我的依赖问题,但我遇到了空指针异常,我需要研究一下原因...LOL - haltman

2

找到了;-) commons lang在classpath中,但似乎是错误的版本。 请求的包是org.apache.commons.lang.builder,在commons-lang3中,该包名为'org.apache.commons.lang3.builder'。所以您需要包含commons-lang 2.x。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接