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

MAX*_*MAX 18 java noclassdeffounderror

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

java ProgAudioJ
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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.
Run Code Online (Sandbox Code Playgroud)

如果我从我的代码中删除:

package es_2011;
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*k W 46

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

cd /myFolder/myPackage

javac MyClass.java 

cd ..

java myPackage.MyClass
Run Code Online (Sandbox Code Playgroud)

编辑 - 一个晚期编辑,以澄清我看到人们感到困惑的事情.在上面的例子中,包只有一个深,这意味着它只是myPackage.如果您的代码有更大的包,就像

package com.somedomain.someproject;
Run Code Online (Sandbox Code Playgroud)

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

cd /myCode
java com.somedomain.someproject.MyMainClass
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你:DI因为没有显示编译错误而弄清楚它到底出了什么问题 (3认同)
  • 有用的答案总是告诉你为什么而不仅仅是如何 (2认同)

Rob*_*ska 2

尝试使用:

java es_2011.ProgAudioJ
Run Code Online (Sandbox Code Playgroud)

(代替java ProgAudioJ)。

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