解决Java中的NoClassDefFoundError问题

sha*_*haw 5 java noclassdeffounderror

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

/home/user/program/Main.java
Run Code Online (Sandbox Code Playgroud)

当我尝试从'program'目录运行Main.java时,一切正常,我使用这一行:

/home/user/program$ java Main
Run Code Online (Sandbox Code Playgroud)

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

/home$ java /home/user/program/Main
Run Code Online (Sandbox Code Playgroud)

我明白了:

Exception in thread "main" java.lang.NoClassDefFoundError: /home/user/program/Main
Caused by: java.lang.ClassNotFoundException: .home.user.program.Main
Run Code Online (Sandbox Code Playgroud)

这个错误的原因是什么?

Mik*_*ffe 10

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

运行java /home/user/program/Main/home试图找到在类路径中类(当前目录),这将看在/home/home/user/program期待找到该文件Main.class包含的定义Main与包装类.home.user.program.

额外的细节:我认为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
Run Code Online (Sandbox Code Playgroud)