【问题标题】:NoClassDefFoundError: wrong nameNoClassDefFoundError:错误的名称
【发布时间】:2011-11-22 11:36:52
【问题描述】:

我编写了一个 java 程序来使用 Netbeans7.0.1 测试 RESTful Web 服务,它在那里运行良好。现在我编写了 build.xml 文件来编译代码,当我尝试运行生成的 .class 文件时,我总是遇到这个异常:

Exception in thread "main" java.lang.NoClassDefFoundError: ClientREST (wrong name: clientrest/ClientREST)
    at java.lang.ClassLoader.defineClass1(Native Method)
    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(Native Method)
    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: ClientREST. Program will exit.

名称和路径是正确的,所以有什么想法为什么会出现此异常?

【问题讨论】:

  • 你的类路径被一个目录关闭了,你可能想至少发布你的 ant 脚本或它的相关部分。

标签: java noclassdeffounderror


【解决方案1】:

线程“main”中的异常 java.lang.NoClassDefFoundError: ClientREST

所以,您以java ClientREST 运行它。它期待一个没有任何packageClientREST.class


(错误名称:clientrest/ClientREST)

嘿,班级正试图告诉你它有一个package clientrest;。您需要从包根目录运行它。向上一个文件夹,这样你就在该文件夹中,该文件夹又包含代表包的clientrest文件夹,然后执行java clientrest.ClientREST

您应该进入clientrest 包文件夹并执行java ClientREST

【讨论】:

  • 一年后,这为我节省了很多时间/精力。我爱 SE。
  • 是的,这里也一样...不过,我已经看到以问题中提出的方式使用的 java 命令,我必须配置什么才能使其工作?
  • 这也帮助了我serialver
  • 优秀的最后一部分。
  • 优秀的答案!只是在其他论坛上浪费了一整天而已!
【解决方案2】:

我在使用命令行 java 时遇到了这个错误:

java -cp stuff/src/mypackage Test

Test.java 驻留在包mypackage 中的位置。

相反,您需要将类路径 -cp 设置为基本文件夹,在本例中为 src,然后将包附加到文件名。

所以它最终会是这样的:

java -cp stuff/src mypackage.Test

【讨论】:

    【解决方案3】:

    进一步说明 Garry 的回复:类路径是类本身所在的基本目录。所以如果类文件在这里 -

    /home/person/javastuff/classes/package1/subpackage/javaThing.class

    您需要按如下方式引用类路径:

    /home/person/javastuff/类

    所以要从命令行运行,完整的命令应该是 -

    java -cp /home/person/javastuff/classes package1/subpackage/javaThing

    即上面的模板是

    java_executable -cp classpath the_class_itself_within_the_class_path

    这就是我最终在没有环境中的类路径的情况下让我的工作的方式

    【讨论】:

      【解决方案4】:

      您生成类的位置可能不存在于类路径中。运行时使用 jvm arg -verbose while running 并检查日志是否正在加载类。

      输出还将为您提供有关从何处加载类的线索,请确保您的类文件存在于该位置。

      【讨论】:

      • 检查异常信息。他以ClientREST 运行它,但“错误名称”消息显示clientrest/ClientREST,这意味着该类实际上在clientrest 包中,因此应该以clientrest.ClientREST 运行。
      【解决方案5】:

      试试下面的语法:

      假设 java 文件驻留在此处:fm/src/com/gsd/FileName.java

      因此您可以使用以下语法运行:

      (将当前目录设为'fm')

      java src.com.gsd.FileName

      【讨论】:

        【解决方案6】:

        假设你有 A 类 和B级

            public class A{
              public static void main(String[] args){
              ....
              .....
             //creating classB object
             new classB();
            
            }
           }
            class B{
            
            }
        

        这个问题可以通过将 B 类移到 A 类中并使用 static 关键字来解决

        public class A{
          public static void main(String[] args){
          ....
          .....
         
          //creating class B
        new classB();
        
        static class B{
        
        }   
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-24
          • 2012-04-03
          • 2013-04-25
          • 2011-06-24
          相关资源
          最近更新 更多