1

从 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;
        }
    }
}
4

0 回答 0