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

尝试执行我的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; 

一切正常。 我如何解决这个问题?

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

 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 

尝试使用:

 java es_2011.ProgAudioJ 

(而不是java ProgAudioJ )。

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

试试这个(编译并运行):

DIR

 2011-02-10 00:30 <DIR> . 2011-02-10 00:30 <DIR> .. 2011-02-10 00:27 58 es_2011 

javac es_2011 / ProgAudioJ

java es_2011.ProgAudioJ

这里有相当清楚的说明:

java.lang.NoClassDefFoundError:ProgAudioJ(错误名称:es_2011 / ProgAudioJ)

如果你想把一个类放在一个包(*)中,那么源代码必须放在相应的目录中,例如,

 src/Main.java <- root package (no declaration) src/es_2011/ProgAudioJ.java <- package es_2011; 

(*)你应该一直这样做,除了小丢弃的东西,可能是主要的类。

尝试这个,

  1. 使用下面的命令编译你的类

     $ javac ProgAudioJ.java -d . 
  2. 运行您的应用程序的命令

     $ java es_2011.ProgAudioJ 

它的原因,当你删除
package es_2011
是你正在改变编译器如何打包,并有效地定位文件。

我有同样的问题 – 错误信息wrong name:确实指出你的答案。 您正在使用错误的名称“ProgAudioJ”来运行.class文件。 它已被封装为

es_2011 / ProgAudioJ

为了运行它 – 你必须移动一个目录:

如果你在这里:(Windows) src\es_2011\
移动到src\

然后运行该行:

java es_2011.ProgAudioJ

这告诉编译器寻找驻留在es_2011包中的ProgAudioJ。 对于标准安装,这将基于文件夹 – 所以它将首先查找es_2011文件夹,然后查找要运行的.class文件的名称(ProgAudio)。