20

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

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

4

6 回答 6

53

因为我发现这些答案不清楚,所以这就是你需要做的。首先,如果您打包您的代码(即您的类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
于 2012-08-20T20:34:49.390 回答
2

尝试使用:

java es_2011.ProgAudioJ

(而不是java ProgAudioJ)。

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

于 2011-02-09T23:32:21.603 回答
2

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

目录

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

于 2011-02-09T23:34:01.453 回答
1

那里写得很清楚:

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

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

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

(*)你应该一直这样做,除了小的扔掉的东西和可能的主要课程。

于 2011-02-09T23:35:55.177 回答
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)。

于 2012-08-22T11:44:53.353 回答
0

尝试这个,

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

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

    $ java es_2011.ProgAudioJ
    
于 2013-05-03T18:43:54.733 回答