5

我有一个名为 Main.java 的 Java 程序,它位于以下目录中:

/home/user/program/Main.java

当我尝试从“程序”目录运行 Main.java 时,一切正常,我使用这一行:

/home/user/program$ java Main

但是当我尝试从主目录运行 Main.java 时:

/home$ java /home/user/program/Main

我得到:

Exception in thread "main" java.lang.NoClassDefFoundError: /home/user/program/Main
Caused by: java.lang.ClassNotFoundException: .home.user.program.Main

这个错误的原因是什么?

4

8 回答 8

10

这是由于您的类路径,默认为当前目录。当您java Main从中运行时,/home/user/program会在当前目录中找到该类(因为该包似乎未设置,这意味着它是默认值)。因此,它在/home/user/program/Main.class.

运行java /home/user/program/Mainfrom/home尝试在类路径(当前目录)中查找类,该类将查找包含带有 package的类的定义的/home/home/user/program文件。Main.classMain.home.user.program

额外细节:我认为 java 启动器试图通过将类名的 /-notation 转换为 .-notation 来做得很好;当您运行时, java /home/user/program/Main它实际上是在java .home.user.program.Main为您运行。这是因为您不应该指定一个文件,而是一个完全指定的类名(即包括包说明符)。当一个类有一个包时,java 期望在与包名匹配的目录结构中找到该类,在类路径中的目录(或 jar)内;因此,它将尝试查找 /home/home/user/program类文件

-cp您可以通过使用or指定您的类路径来修复它-classpath

java -cp /home/user/program Main
于 2011-03-21T10:30:39.393 回答
3

因为它使用您提供的全名(/home/user/program/Main)来查找类。您应该只查找 Main 类,但使用好的类路径:java Main -cp /home/user/program

这意味着它将在给定的一组路径中搜索 Main 类

于 2011-03-21T10:28:36.743 回答
0

问题是,如果你调用java /home/user/program/Mainpackage Mainis in is mean to be home.user.program,我认为这是不正确的Main(我认为它在默认包中,即根本没有)。package顶部有声明Main吗?

我建议在其他答案中使用类路径建议。

于 2011-03-21T10:34:06.850 回答
0

这对我有用:

java -cp /home/user/program 主程序

于 2011-03-21T10:35:07.340 回答
0

刚才遇到了(NoClassDefFoundError)这种错误。我使用 eclipse env 在我的 android 应用程序中导入了一些第三方库。我在运行时收到此错误 - 无法找到此第三方库中的某些类,并且抛出此 NoClassDefFoundError 的结果,尽管提到的库正确出现在类路径中,所以我真的不知道还能做什么来解决这个问题。在“Java Build Path”中使用“Order and Export”选项卡时,我将导入的第三方库放在我项目中所有库列表的顶部并选中它的复选框- 这解决了问题

于 2013-07-06T20:02:31.533 回答
0

您的第二个命令版本不知道在哪里可以找到这些类。您需要提供所谓的类路径

/home$ java -cp userprogram Main
于 2011-03-21T10:29:47.640 回答
0

我在尝试编译和运行它时遇到了同样的错误。《Head First Java》一书恰当地解释并解决了这个问题。这是本书的截图,供您参考。

Head First Java 中关于如何通过包含包名称来编译和运行 Java 程序的屏幕截图。

希望它有帮助。

于 2013-09-13T08:51:05.087 回答
0

由于你所说,我得出以下结论:

  • 主要位于“顶部”(根)包中

当你执行 java 时,你必须指明类路径,它是你的包和类结构所在的根目录。

在您的情况下,它就是 /home/user/program。我猜你的类路径被定义为“。” (您所在的目录)。当您从家里调用 java 时,类路径被错误地采用。

如果您想使用不同的包调用 main ,请在类的顶部声明该包:

package user.program;

并将类路径设置为 /home(或从该目录执行 java)。接下来以这种方式调用java:

java user.program.Main

使用点,因为它是一个完整的类名(表示包)。这被翻译成连接类路径+包+类的目录。举例:

/home
user.program -> user/program/
Main         -> Main.class

祝你好运!

于 2011-03-21T10:31:38.470 回答