包中的NoClassDefFoundError

时间:2013-09-04 14:45:25

标签: package noclassdeffounderror

从Windows命令提示符运行Java时,我遇到了 NoClassDefFoundError 的问题。我将主要的TestLogger.java文件放在C:\ mywork和C:\ mywork \ logging中的其他四个java文件中,这些文件被组织为一个包。

编译这些文件(javac TestLogger.java),甚至创建一个jar文件都没有困难,但是在尝试运行已编译的TestLogger时失败了,并且在线程'主'java中得到了“异常”。 lang.NoClassDefFoundError ”。

我也在网上进行了一些搜索,发现大多数收到此错误的人只是尝试运行一个简单的HelloWorld程序。所以我在C:\ mywork中尝试了我自己的HelloWorld.java并且很奇怪,编译和运行它没有问题。我在网上找到的各种解决方案,例如检查环境变量,以及在-classpath参数之后添加句点,都不能解决我的问题。

我在Windows XP上使用JDK 1.7。我确信环境变量没有任何问题。以下是我的源文件的完整内容(来自Jeff Friesen的第二版 Learn Java for Android Development ,第175页的示例)。希望有人可以对此有所了解。提前谢谢!

在C:\ mywork中,我只有一个文件作为主要入口。

TestLogger.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)Logger.java:

    package logging;

    public interface Logger {
        boolean connect();
        boolean disconnect();
        boolean log(String msg);
    }

2)Console.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)File.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;
        }
    }
}

0 个答案:

没有答案