线程'main'中的异常java.lang.NoClassDefFoundError:

问题描述 投票:47回答:21

以下程序抛出错误:

public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello World!"); 
    }
}

CLASSPATH C:\Program Files\Java\jdk1.6.0_18\bin\

Path C:\Program Files\Java\jdk1.6.0_18\bin\

JAVAHOME C:\Program Files\Java\jdk1.6.0_18\bin

你能告诉我根本原因吗?

java noclassdeffounderror
21个回答
66
投票

我找到了另一个常见的原因。如果使用像eclipse这样的IDE在包内创建java文件,您将在java文件的顶部找到包名称,如“package pkgName”。如果您尝试从命令提示符运行此文件,您将收到NoClassDefFoundError错误。从java文件中删除包名称,然后使用命令提示符中的命令。为此浪费了3个小时。 - 阿比


1
投票

我遇到了同样的问题,偶然发现了“Build Main Project F11”的解决方案。 ide提出了一个“选项”,我可能想要取消选中Project配置对话框的Build> Compiling部分中的'Compile on Save'。取消选中'Complile on Save',然后按常规(对我而言)'Clean and Build'为我做了诀窍。


1
投票

有同样的问题尝试上面的解决方案但没有工作。我不得不通过我的java代码才发现主函数无法被识别,因为它没有空格btw和(String)即初始代码:

public static void main(String[]args){

工作代码。

public static void main (String[]args){

希望我能帮助别人。


1
投票

Java文件:

package com.beans;

public class Flower{
 .......
}

packages :=> com.beans,
java class Name:=> Flower.java,
Folder structure (assuming):=> C:\com\beans\Flower.*(both .java/.class exist here)

然后有两种执行方式:

1. Goto top Folder (here its C:\>),
     then : C:> java com.beans.Flower 
2. Executing from innermost folder "beans" here (C:\com\beans:>),
     then: C:\com\beans:> java -cp ./../.. com.beans.Flower

0
投票

在文件夹中的cmd提示符下键入以下内容:

set classpath=%classpath%;.;

0
投票

我有这个错误,因为我在包中有我的文件。所以我的foo包我不得不称之为:

java foo.HelloWorld


0
投票

这里的问题是设置环境和类文件的运行。一个。要设置环境路径,请运行以下命令:set path = C:\ Program Files(x86)\ Java \ jdk1.7.0 \ bin b。从包中运行程序,如com.test.TestJavaClass

命令:java com.test.TestJavaClass

这里的一般问题是我们从包内部运行它,如src / package / name。我们不应该包含src,包名就足够了。


0
投票

简单易用的解决方案:我通过将原始项目导出到zip文件,删除原始项目目录并从zip文件导回项目来解决了这个问题(NetBeans)。


0
投票

试着做

javac Hello.java

然后,如果它没有编译器错误(它不应该这样做,因为我看不到你的程序中的任何错误),然后键入

java Hello


0
投票

如果你想'编译和执行'你用任何IDE创建的任何java文件(比如eclipse),只需运行以下命令:

编译:javac Users\dhiraj01\workspace\Practice\src\PracticeLogic\Logics.java

执行:java -classpath Users\dhiraj01\workspace\Practice\src\ PracticeLogic.Logics


0
投票

我花了四个小时尝试各种排列和搜索建议。

最后,发现这篇文章有效,但不是改变原始代码来测试它的最佳解决方案。

  1. 试图改变CLASSPATH,包括类库,set classpath=JDKbin;JDKlib;JREbin;JRElib;myClassLib;.
  2. 将当前目录更改为父目录(包文件夹)并且累了java <packageName>.<className>也尝试了java ..\<packageName>.<className>

都没有奏效。

然而,只有第一反应才有效非常感谢Abhi!

“我找到了另一个常见的原因。如果你使用像eclipse这样的IDE在包内创建java文件,你会在你的java文件的顶部找到包名称,如”package pkgName“。如果你试图从命令运行这个文件提示,您将收到NoClassDefFoundError错误。从java文件中删除包名称并使用命令提示符中的命令。为此浪费了3个小时。 - Abhi“

好奇,如果有任何其他方法使其工作而不必更改原始代码?谢谢!


27
投票
Exception in thread "main" java.lang.NoClassDefFoundError  

java试图找到你的.class文件的地方之一是你当前的目录。因此,如果您的.class文件位于C:\java中,则应将当前目录更改为该目录。

要更改目录,请在提示符处键入以下命令,然后按Enter键:

cd c:\java  

这个.告诉java你的c​​lasspath是你的本地目录。

Executing your program using this command should correct the problem:
java -classpath . HelloWorld  

0
投票

如果您的Program.java位于“src / mypkg / subpkg /”目录中:

去“src”目录

然后编译使用“javac mypkg / subpkg / Program.java”

要运行使用“java mypkg.subpkg.Program.class”


0
投票

我终于发现这是Apache Netbeans编辑器的一个错误:

以下步骤将删除错误:

  1. 将文件名和类重命名为Abc
  2. 关闭编辑器
  3. 重新打开编辑器
  4. 将文件名和类从Abc重命名为以前的名称
  5. 现在调试项目(Ctrl + F5)工作正常

希望有帮助,如果你使用新的Apache Netbeans(不是旧的Netbeans)


14
投票

如果您的包是helloworld,您将转到您的包的父目录然后运行:

java helloworld.HelloWorld

11
投票

像这样运行:

java -jar HelloWorld.jar

5
投票

http://scottizu.wordpress.com/2013/08/28/fixing-the-exception-in-thread-main-java-lang-noclassdeffounderror-in-eclipse/

这是可以从Windows命令提示符运行的Java命令的长形式:

"C:\Program Files\Java\jdk1.6.0_18\bin\javac.exe" -classpath "C:\Users\Scott\workspace\myproject" com\mycompany\myapp\HelloWorld.java
"C:\Program Files\Java\jdk1.6.0_18\bin\java.exe" -classpath "C:\Users\Scott\workspace\myproject" com.mycompany.myapp.HelloWorld
  1. 这些命令可以从任何目录运行,这意味着您不必位于HelloWorld.java文件所在的目录中。
  2. 第一行编译HelloWorld.java文件,创建一个HelloWorld.class文件。
  3. 第二行运行HelloWorld.class文件。
  4. -classpath告诉java在每个命令中查找指定文件的位置
  5. Java编译器(javac.exe)需要相对于类路径的java文件的位置(即文件位于C:\ Users \ Scott \ workspace \ myproject \ com \ mycompany \ myapp \ HelloWorld.java)
  6. Java(java.exe)期望包(即com.mycompany.myapp)和类(HelloWorld)相对于类路径(即文件位于C:\ Users \ Scott \ workspace \ myproject \ com \ mycompany \ myapp \ HelloWorld.class文件)

请注意,类路径最后没有斜杠。 javac.exe命令期望文件以“.java”结尾。 java.exe命令需要完整的类名,并且不以“.class”结尾。

有几种方法可以简化这些命令:

  1. 您不必指定java.exe的完整路径。将Java添加到Windows路径(Run-> sysdm.cpl-> Advanced Tab-> Environment Variables-> Select Path-> Edit-> Append“; C:\ Program Files \ Java \ jdk1.6.0_18 \ bin \”) 。或者您可以附加JAVA_HOME并创建该环境变量。
  2. 您不必输入整个类路径(即,您只需使用-classpath“。”)。输入您将要使用的目录: cd“C:\ Users \ Scott \ workspace \ myproject \”
  3. 您可以使用默认包(将HelloWorld.java文件目录放在工作目录中,不要使用Java包指令)

如果你进行了这些更改,你就可以运行这样的东西(你可能可以省略-classpath“。”):

cd "C:\Users\Scott\workspace\myproject\"
javac -classpath "." HelloWorld.java
java -classpath "." HelloWorld

4
投票

这是最终奏效的。

`@echo off
set path=%path%;C:\Program Files\Java\jdk1.7.0_71\bin;
set classpath=C:\Program Files\Java\jdk1.7.0_71\lib;
cd <packageDirectoryName>
javac .\trainingPackage\HelloWorld.java
cd ..
java trainingPackage.HelloWorld 
REM (Make sure you are on the parent directory of the PackageName and not inside the    Packagedirectory when executing java).`

3
投票

NoClassDefFounError本身的javadoc将是一个良好的开端(here),然后我建议你清理并重建你的项目。


1
投票

CLASSPATH变量需要包含Java程序.class文件所在的目录。你可以包括'。'在CLASSPATH中表示应包含当前目录。

set CLASSPATH=%CLASSPATH%;.

1
投票

您的CLASSPATH也需要知道您的HelloWorld课程的位置。

简单来说,如果从DOS提示符运行.CLASSPATH命令,则应在javac中附加点java(表示当前目录)。

© www.soinside.com 2019 - 2024. All rights reserved.