从 Windows 命令提示符运行 Java 时出现NoClassDefFoundError问题。我将主要的 TestLogger.java 文件放在 C:\mywork 中,并将其他四个 java 文件放在 C:\mywork\logging 中,它们被组织为一个包。
编译这些文件(javac TestLogger.java),甚至创建一个 jar 文件都没有困难,但是我在尝试运行编译后的 TestLogger 时失败了,并且得到了“线程 'main' java.lang.NoClassDefFoundError 中的异常”。
我还在网上进行了一些搜索,发现大多数遇到此错误的人只是试图运行一个简单的 HelloWorld 程序。所以我在 C:\mywork 中尝试了我自己的 HelloWorld.java 并且很奇怪,编译和运行它没有问题。我在网上找到的各种解决方案,例如检查环境变量,以及在 -classpath 参数后添加一个句点,都无法在我的情况下创造奇迹。
我在 Windows XP 上使用 JDK 1.7。我确定环境变量没有任何问题。以下是我的源文件的全部内容(来自 Jeff Friesen 的Learn Java for Android Development第 2 版的示例,第 175 页)。希望有人可以对此有所了解。提前致谢!
在 C:\mywork 中,我有一个文件作为主入口。
测试记录器.java:
package logging;
import logging.Logger;
import logging.LoggerFactory;
public class TestLogger {
public static void main(String[] args) {
Logger logger = LoggerFactory.newLogger(LoggerFactory.CONSOLE);
if (logger.connect()) {
logger.log("test message #1");
logger.disconnect();
}
else
System.out.println("cannot connect to console-based logger");
logger = LoggerFactory.newLogger(LoggerFactory.FILE, "x.txt");
if (logger.connect()) {
logger.log("test message #2");
logger.disconnect();
}
else
System.out.println("cannot connect to file-based logger");
logger = LoggerFactory.newLogger(LoggerFactory.FILE);
if (logger.connect()) {
logger.log("test message #3");
logger.disconnect();
}
else
System.out.println("cannot connect to file-based logger");
}
}
在 C:\mywork\logging 文件夹中,我有四个文件:
1)记录器.java:
package logging;
public interface Logger {
boolean connect();
boolean disconnect();
boolean log(String msg);
}
2)控制台.java:
package logging;
public class Console implements Logger {
private String dstName;
Console(String dstName) {
this.dstName = dstName;
}
@Override
public boolean connect() {
return true;
}
@Override
public boolean disconnect() {
return true;
}
@Override
public boolean log(String msg) {
System.out.println(msg);
return true;
}
}
3)文件.java:
package logging;
public class File implements Logger {
private String dstName;
File(String dstName) {
this.dstName = dstName;
}
@Override
public boolean connect() {
if (dstName == null)
return false;
System.out.println("opening file " + dstName);
return true;
}
@Override
public boolean disconnect() {
if (dstName == null)
return false;
System.out.println("closing file " + dstName);
return true;
}
@Override
public boolean log(String msg) {
if (dstName == null)
return false;
System.out.println("writing "+msg+" to file " + dstName);
return true;
}
}
4)LoggingFactory.java:
package logging;
public abstract class LoggerFactory {
public final static int CONSOLE = 0;
public final static int FILE = 1;
public static Logger newLogger(int dstType, String... dstName) {
switch (dstType) {
case CONSOLE:
return new Console(dstName.length == 0 ? null : dstName[0]);
case FILE:
return new File(dstName.length == 0 ? null : dstName[0]);
default:
return null;
}
}
}