2013-03-11 29 views
0

我已经编写了一个Java类,它实现了在另一个目录中指定的接口。我编译应用程序是这样的:在编译时在类路径上找到类,但在运行时找不到类

javac ArrayQueue.java -cp QueueArray 

ArrayQueue实现接口Queue目录QueueArray。如果没有指定的类路径,编译器会按预期抛出错误。

然而,运行程序后,该程序时,它不能再找到类:

java ArrayQueue -cp QueueArray 
Exception in thread "main" java.lang.NoClassDefFoundError: Queue 

什么可能会导致这?

编辑:程序工作正常,如果我的.class文件复制到同一目录ArrayQueue.class

+0

目录结构和包声明? – Thihara 2013-03-11 10:05:12

+0

您是否检查过.class文件是否存在?您将在运行时需要.class文件。 – 2013-03-11 10:06:34

+0

@Thihara所有的类都在默认包中,其中main的文件是'ArrayQueue.java',而使用的类是'QueueArray/Queue.java'相对于主文件。 – Overv 2013-03-11 10:06:55

回答

1

这可能会有所帮助。从JLS, 3rd edition:Java平台必须支持至少一个无名 包

的实现; 它可能支持多个未命名的软件包,但不需要这样做,但可以使用 。每个未命名的 包中的哪些编译单元由主机系统确定。

在使用分层文件系统 用于存储包Java平台的实现,一个典型的策略是一个 未命名的包,每个目录相关联; 一次只能观察到一个未命名包,即 ,即与当前工作目录关联的那个包。“当前工作 目录”的确切含义取决于主机系统。

看来您使用的JVM不支持默认软件包,除非它们与当前目录相关联,也就是您从中启动您的自定义队列类的目录。

一般来说,使用默认包是一个坏主意,我的建议是将两个类与一个包关联,重新编译并重新测试您的代码。

0

使用java -classpath . class_having_main_method

+1

完全相同的错误和我的理解'-classpath'选项在这里是多余的。 – Overv 2013-03-11 10:01:08

相关问题