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

时间:2011-06-13 17:51:32

标签: java noclassdeffounderror

以下程序引发错误:

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

你能告诉我根本原因吗?

24 个答案:

答案 0 :(得分:66)

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

就我而言,包名是用小写字母写的,虽然包名是大写的。阿比,非常感谢。

答案 1 :(得分:27)

Exception in thread "main" java.lang.NoClassDefFoundError  

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

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

cd c:\java  

这个.告诉java你的类路径是你的本地目录。

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

答案 2 :(得分:14)

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

java helloworld.HelloWorld

答案 3 :(得分:11)

像这样运行:

java -jar HelloWorld.jar

答案 4 :(得分: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)
  7. 请注意,类路径末尾没有斜杠。 javac.exe命令期望文件以“.java”结尾。 java.exe命令需要完整的类名,并且不以“.class”结尾。

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

    1. 您不必指定java.exe的完整路径。将Java添加到Windows路径(运行 - > sysdm.cpl->高级选项卡 - >环境变量 - >选择路径 - >编辑 - >追加“; C:\ Program Files \ Java \ jdk1.6.0 _18 \ BIN \“)。或者,您可以附加JAVA_HOME并创建该环境变量。
    2. 您不必输入整个类路径(即,您只需使用-classpath“。”)。输入您将要使用的目录:

      cd“C:\ Users \ Scott \ workspace \ myproject \”

    3. 您可以使用默认包(将HelloWorld.java文件目录放在工作目录中,不要使用Java包指令)

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

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

答案 5 :(得分: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).`

答案 6 :(得分:3)

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

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

public static void main(String[]args){

工作代码。

public static void main (String[]args){

希望我能帮助别人。

答案 9 :(得分: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

答案 10 :(得分:1)

我遇到了同样的问题,偶然发现了“Build Main Project F11”的解决方案。 ide提出了一个“选项”,我可能想要取消选中“Compile on Save” 在Build&gt;编译“项目配置”对话框的一部分。 取消选中'保存时的Complile',然后按常规(对我而言)'清理和构建'为我做了诀窍。

答案 11 :(得分:1)

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

set CLASSPATH=%CLASSPATH%;.

答案 12 :(得分:0)

您可以在pom.xml中找到有关所需库的信息,使用Apache Maven之类的工具来构建Java应用程序要容易得多。

    <dependency>
        <groupId>org.yaml</groupId>
        <artifactId>snakeyaml</artifactId>
        <version>1.20</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-text</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-math3</artifactId>
        <version>3.6.1</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>24.0-jre</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.inject.extensions</groupId>
        <artifactId>guice-assistedinject</artifactId>
        <version>4.2.0</version>
    </dependency>

答案 13 :(得分:0)

我曾经用过Maven的这个问题。我只单击maven项目ant,然后命名

project-> plugins -> clean -> and button run

enter image description here

答案 14 :(得分:0)

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

以下步骤将消除错误:

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

希望在您使用新的Apache Netbeans(而不是旧的Netbeans)时有所帮助

答案 15 :(得分:0)

将jar添加到您的类路径中。

例如,如果您的类NoClassDefFoundErrorXXXXXX,请获取包含该类的jar,然后将其手动添加到您的类路径中。

对我有用。希望它也对您有用。

答案 16 :(得分:0)

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

转到“src”dir

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

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

答案 17 :(得分:0)

如果您想编译并执行&#39;您使用任何IDE(如eclipse)创建的任何java文件,只需运行以下命令:

  

<强>编译:   echo '<b>What happened:&nbsp;&nbsp;</b><div id="what_happened" style="max-height:600px; overflow:auto;">' . $player_complaints_offence . '</div></b><p></fieldset><p>';

     

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

答案 18 :(得分:0)

尝试

javac Hello.java

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

java Hello

答案 19 :(得分:0)

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

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

  1. 尝试更改CLASSPATH,以包含类库set classpath=JDKbin;JDKlib;JREbin;JRElib;myClassLib;.
  2. 将当前目录更改为父目录(包文件夹),累了java <packageName>.<className>也尝试了java ..\<packageName>.<className>
  3. 都没有奏效。

    然而,仅第一反应就起作用了。非常感谢Abhi !!!

      

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

    好奇是否还有其他方法可以让它无需更改原始代码?谢谢!

答案 20 :(得分:0)

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

答案 21 :(得分:0)

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

命令:java com.test.TestJavaClass

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

答案 22 :(得分:0)

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

java foo.HelloWorld

答案 23 :(得分:0)

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

set classpath=%classpath%;.;