线程“主”java.lang.NoClassDefFoundError 中的异常:

Posted

技术标签:

【中文标题】线程“主”java.lang.NoClassDefFoundError 中的异常:【英文标题】:exception in thread 'main' java.lang.NoClassDefFoundError: 【发布时间】:2011-09-14 02:49:23 【问题描述】:

以下程序抛出错误:

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_HOME 不应包含 bin。在我的系统上,我这样做: JAVA6_HOME=c:\sdks\jdk1.6.0_18 JAVA_HOME=%JAVA6_HOME% PATH=%PATH%;%JAVA_HOME%\bin 【参考方案1】:

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

【讨论】:

但是如何在不删除包名的情况下从命令提示符运行它,我需要包名【参考方案2】:
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  

【讨论】:

【参考方案3】:

如果你的包是helloworld,你会去你的包的父目录然后运行:

java helloworld.HelloWorld

【讨论】:

【参考方案4】:

像这样运行它:

java -jar HelloWorld.jar

【讨论】:

我完全忘记了应该使用该选项调用 jar-packed 应用程序.. :/ 干杯!【参考方案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
    这些命令可以从任何目录运行,这意味着您不必在 HelloWorld.java 文件所在的目录中。 第一行编译您的 HelloWorld.java 文件,创建一个 HelloWorld.class 文件。 第二行运行 HelloWorld.class 文件。 -classpath 告诉 java 在哪里寻找每个命令中的指定文件 Java 编译器 (javac.exe) 需要 java 文件相对于类路径的位置(即文件位于 C:\Users\Scott\workspace\myproject\com\mycompany\myapp\HelloWorld.java ) Java (java.exe) 需要包(即 com.mycompany.myapp)和类 (HelloWorld),相对于类路径(即文件位于 C:\Users\Scott\workspace\myproject\com\ mycompany\myapp\HelloWorld.class)

注意类路径末尾没有斜线。 javac.exe 命令要求文件以“.java”结尾。 java.exe 命令需要完整的类名,并且不以“.class”结尾。

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

    您不必指定 java.exe 的完整路径。将Java添加到Windows路径(运行->sysdm.cpl->高级选项卡->环境变量->选择路径->编辑->追加“;C:\Program Files\Java\jdk1.6.0_18\bin\”) .或者您可以附加 JAVA_HOME 并创建该环境变量。

    您不必输入整个类路径(即,您可以只使用 -classpath ".")。输入您将在其中工作的目录:

    cd "C:\Users\Scott\workspace\myproject\"

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

如果您进行这些更改,您将运行类似这样的操作(并且您可能可以省略 -classpath "."):

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

【讨论】:

【参考方案6】:

这是最终奏效的方法。

`@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).`

【讨论】:

【参考方案7】:

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

【讨论】:

我刚刚对我的项目执行了清理和构建,它工作正常,我在尝试调试时遇到了这个错误,但是在 NetBeans IDE 8.1 中进行了简单的清理和构建工作。先试试这个。【参考方案8】:

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

set CLASSPATH=%CLASSPATH%;.

【讨论】:

【参考方案9】:

您的CLASSPATH 还需要知道您的HelloWorld 班级的位置。

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

【讨论】:

【参考方案10】:

我遇到了同样的问题,偶然发现了“构建主项目 F11”的解决方案。 ide 提出了一个“选项”,我可能想取消选中“保存时编译” 在项目配置对话框的构建 > 编译部分。 取消选中“保存时编译”,然后执行通常的(对我而言)“清理和构建”对我有用。

【讨论】:

【参考方案11】:

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

set classpath=%classpath%;.;

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

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

命令:java com.test.TestJavaClass

这里的一般问题是我们从像 src/package/name 这样的包内部运行它。 src不要加,包名就够了。

【讨论】:

【参考方案14】:

尝试做

javac Hello.java

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

java Hello

【讨论】:

【参考方案15】:

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

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

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

【讨论】:

【参考方案16】:

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

转到“src”目录

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

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

【讨论】:

【参考方案17】:

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

以下步骤将消除错误:

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

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

【讨论】:

【参考方案18】:

我有这个问题,我使用了 maven。我只需点击 maven projects ant 然后命名

project-&gt; plugins -&gt; clean -&gt; and button run.

【讨论】:

【参考方案19】:

您可以在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>

【讨论】:

【参考方案20】:

在你的类路径中添加 jar。

例如,如果您有 NoClassDefFoundError 用于类 XXXXXX,则获取包含该类的 jar 并将其手动添加到您的类路径中。

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

【讨论】:

以上是关于线程“主”java.lang.NoClassDefFoundError 中的异常:的主要内容,如果未能解决你的问题,请参考以下文章

主线程啥都没做,就会等待子线程结束。这是为啥?

Android 异步操作Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )

子线程怎么不阻塞主线程

QT中UI主窗口如何与子线程相互传递参数

java 子线程 回调 主线程

C++怎么在主线程中使用子线程的数据? 比如说主线程中有一个数组,如何在子线程中调用这个数组