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 路径
中很可能缺少某些资源
我执行了一个 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 classorg.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 路径