NoClassDefFoundError 尽管 class 在同一个文件夹中

NoClassDefFoundError eventhough class in in same folder

我执行了一个 main class 并得到了以下错误和跟踪。

这是控制台命令:

java -cp . net.sf.tinyPayroll.Main

Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.hsqldb.Trace
    at org.hsqldb.Database.reopen(Unknown Source)
    at org.hsqldb.Database.open(Unknown Source)
    at org.hsqldb.DatabaseManager.getDatabase(Unknown Source)
    at org.hsqldb.DatabaseManager.newSession(Unknown Source)
    at org.hsqldb.jdbc.jdbcConnection.<init>(Unknown Source)
    at org.hsqldb.jdbcDriver.getConnection(Unknown Source)
    at org.hsqldb.jdbcDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at net.sf.tinyPayroll.dao.DBConnector.connectDataFile(DBConnector.java:88)
    at net.sf.tinyPayroll.dao.DBConnector.<init>(DBConnector.java:72)
    at net.sf.tinyPayroll.dao.DBConnector.getInstance(DBConnector.java:106)
    at net.sf.tinyPayroll.model.DataFile.<init>(DataFile.java:53)
    at net.sf.tinyPayroll.Main.main(Main.java:42)

但是,所有必需的 class 都在同一个文件夹中。

这是在同一文件夹中提取并可用的文件(整个库以提取形式提供)。

find . -name Trace*

./org/hsqldb/Trace.class
./org/hsqldb/util/Traceable.class

你的例外是:

NoClassDefFoundError: Could not initialize class org.hsqldb.Trace

这并不意味着它在您的 class 路径中找不到 class org.hsqldb.Trace,这意味着 class 找不到由于某种原因被初始化

这通常意味着 RuntimeException 在尝试将值分配给 静态字段 或尝试在 中执行某些代码时抛出=]静态块.

例如我们在接下来的案例中会遇到这样的问题:

class Trace {

    static MyClass foo = MyClass.newInstance(); // If it fails while calling newInstance

    static {
        SomeClass.init(); // If it fails while calling SomeClass.init()
    }
    ...
}

正如 Nicolas 提到的,这并不意味着它无法在您的 class 路径中找到 class org.hsqldb.Trace,这意味着 class 无法找到由于某种原因初始化。 我检查了代码(这可能会根据版本而改变)http://grepcode.com/file/repo1.maven.org/maven2/hsqldb/hsqldb/1.8.0.1/org/hsqldb/Trace.java 在 class 它有一些静态块做一些处理。您的 class 路径

中很可能缺少某些资源