编译时在类路径中找到类,但在运行时不会找到类

时间:2013-03-11 09:57:58

标签: java classpath

我编写了一个Java类,它实现了另一个目录中指定的接口。我像这样编译应用程序:

javac ArrayQueue.java -cp QueueArray

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

然而,在此之后运行程序时,它无法再找到该类:

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

可能导致这种情况的原因是什么?

修改:如果我将.class文件复制到与ArrayQueue.class相同的目录,该程序可以正常工作。

2 个答案:

答案 0 :(得分:1)

这可能会有所帮助。来自JLS, 3rd edition

  

Java平台的实现必须至少支持一个   未命名的包裹; 它可能支持多个未命名的包,但是   不要求这样做。每个未命名的编译单元   包由主机系统确定

     

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

您使用的JVM似乎不支持默认包,除非它们与当前目录相关联,即您启动自定义队列类的目录。

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

答案 1 :(得分:0)

使用java -classpath . class_having_main_method