2011-02-09 148 views
18

尝试执行我的Java应用程序时出现问题。如果我从我的代码删除从命令行执行Java程序时收到“错误名称”NoClassDefFoundError

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; 

一切完美 每当我试着通过命令

java ProgAudioJ 

执行程序我得到这个错误。我该如何解决问题?

+0

你是什么意思“,如果我删除es_2011' - 从中​​删除在哪里? – akf 2011-02-09 23:14:15

+0

我的意思是代码.. – MAX 2011-02-09 23:15:53

+3

我认为你需要展示代码来说明你的意思。 – DaveJohnston 2011-02-09 23:19:13

回答

2

尝试使用:(代替java ProgAudioJ

java es_2011.ProgAudioJ 

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

2

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

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

1

这是相当明确提出有:

java.lang.NoClassDefFoundError: ProgAudioJ (wrong name: es_2011/ProgAudioJ)

如果你想要把一个类的包(*),然后将源代码必须放置在相应的目录,例如,

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

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

44

因为我发现这些答案不清楚,所以这里是你需要做的。 首先,如果你打包你的代码(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 
0

,当你删除
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)。

0

试试这个,

  1. 使用以下命令 

    $ javac ProgAudioJ.java -d . 
    
  2. 通过命令来运行你的应用程序编译类

    $ java es_2011.ProgAudioJ