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

时间:2011-02-09 23:11:03

标签: 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;

一切都很完美。我该如何解决这个问题?

6 个答案:

答案 0 :(得分:46)

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

答案 1 :(得分:2)

尝试使用:

java es_2011.ProgAudioJ

(而不是java ProgAudioJ)。

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

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

答案 3 :(得分:1)

在那里说得很清楚:

  

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

如果要将类放在包(*)中,则必须将源代码放在相应的目录中,例如,

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

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

答案 4 :(得分: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)。

答案 5 :(得分:0)

试试这个,

  1. 使用以下命令编译您的课程

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

    $ java es_2011.ProgAudioJ