解决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”解释并适当地解决了这个问题。 以下是本书的截图供您参考。
希望它有所帮助。