【问题标题】:Receiving "wrong name" NoClassDefFoundError when executing a Java program from the command-line从命令行执行 Java 程序时收到“错误名称”NoClassDefFoundError
【发布时间】:2011-06-24 12:20:52
【问题描述】:

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

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

【问题讨论】:

  • “如果我删除 es_2011”是什么意思 - 从哪里删除?
  • 我认为你需要展示代码来说明你的意思。
  • 你在为你的班级使用包名吗?
  • 这一行是代码的一部分:package es_2011;如果我删除它,执行过程会顺利进行..我使用 JCreator 构建程序并且没问题,但现在我正在尝试通过命令行执行
  • 请选择Mark W的答案

标签: java noclassdeffounderror


【解决方案1】:

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

【讨论】:

  • 非常感谢 :D 因为没有显示编译错误,所以我快要弄清楚它到底出了什么问题了
  • 有用的答案总是告诉你为什么而不是仅仅告诉你如何
  • 谢谢,OP应该选择这个答案
  • 非常有帮助。谢谢。
【解决方案2】:

尝试使用:

java es_2011.ProgAudioJ

(而不是java ProgAudioJ)。

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

【讨论】:

    【解决方案3】:

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

    目录

    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

    【讨论】:

      【解决方案4】:

      那里写得很清楚:

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

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

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

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

      【讨论】:

        【解决方案5】:

        试试这个,

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

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

          $ java es_2011.ProgAudioJ
          

        【讨论】:

          【解决方案6】:

          删除时它起作用的原因
          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)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-16
            • 1970-01-01
            • 2012-08-01
            • 1970-01-01
            • 2012-05-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多