从命令行执行 Java 程序时收到“错误名称”NoClassDefFoundError

2022-09-02 05:14:29

我在尝试执行我的Java应用程序时遇到问题。每当我尝试通过命令执行程序时

java ProgAudioJ

我收到此错误:

Exception in thread "main"
java.lang.NoClassDefFoundError: ProgAudioJ (wrong name: es_2011/ProgAudioJ)
        at java.lang.ClassLoader.defineClass1(NativeMethod)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(NativeMethod)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: ProgAudioJ.  Program will exit.

如果我从代码中删除:

package es_2011;

一切都很完美。如何解决问题?


答案 1

因为我发现这些答案不清楚,所以这是你需要做的。首先,如果打包代码(即类的顶部有关键字),则编译的类必须位于与代码中的包声明同名的目录中。编译类后,在执行 java 命令时需要向上移动一个目录,并包括包的名称。例如,如果你的代码存在于 中,并且你的类以 开头(请注意,目录和包是相同的名称),那么你可以执行以下操作(linux / osx):package/myFolder/myPackage/package myPackage

cd /myFolder/myPackage

javac MyClass.java 

cd ..

java myPackage.MyClass

编辑 - 一个迟到的编辑,以澄清我看到人们感到困惑的事情。在上面的示例中,包只有一个深度,这意味着它只是 myPackage。如果你的代码有一个更大的包,比如

package com.somedomain.someproject;

您需要从包含该软件包的根目录的目录中执行java命令。例如,如果你编译的代码在myCode/com/somedomain/someproject/MyMainClass中.class,那么你将从myCode文件夹执行java命令,如下所示(再次,特别注意目录结构与包声明相同):

cd /myCode
java com.somedomain.someproject.MyMainClass

答案 2

尝试使用:

java es_2011.ProgAudioJ

(而不是 )。java ProgAudioJ

我在这里对你当前的工作目录和CLASSPATH做了一些假设。如果您可以提供有关您正在运行的命令的信息(例如,您所在的目录,类文件所在的位置等),我们可以更有效地为您提供帮助。


推荐