解决Java中的NoClassDefFoundError问题

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

/home/user/program/Main.java 

当我尝试从’program’目录运行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 

这个错误的原因是什么?

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

/home运行java /home/user/program/Main尝试在类路径(当前目录)中查找类,它将在/home/home/user/program中查找期望找到包含定义的文件Main.class包含.home.user.program包的Main类。

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

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

 java -cp /home/user/program Main 

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

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

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

 /home$ java -cp userprogram Main 

因为你说的我总结这个:

  • Main位于“top”(root)包中

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

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

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

 package user.program; 

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

 java user.program.Main 

使用点因为它是一个完整的类名(表示包)。 这被转换为dirs连接classpath + package + class。 例如:

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

祝你好运!

问题是,如果你调用java /home/user/program/Main那么java /home/user/program/Main包就是home.user.program ,我认为它不适用于Main (我假设它在默认包中,即没有在所有)。 Main的顶部是否有package声明?

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

这对我有用:

java -cp / home / user / program主要

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

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

Head First Java的截图,介绍如何通过包含包名来编译和运行java程序。

希望它有所帮助。