【问题标题】:Cannot run compiled java class, error: Class names are only accepted if annotation processing is explicitly requested无法运行已编译的 java 类,错误:仅当显式请求注释处理时才接受类名
【发布时间】:2012-03-28 05:50:24
【问题描述】:

好的,这似乎是在here 中讨论很多的典型错误,但是我仍然不知道我的程序有什么问题。我使用命令提示符来编译我的 java 类。

TestQueueString.java 是我创建的一个简单的类来测试我的实现 QueueStringBlock.java 中队列的块表示。我就是这样编译的。

C:\Users\ME\Desktop\Lab>javac -cp DAT.jar;Exceptions.jar QueueStringBlock.java TestQueueString.java

C:\Users\ME\Desktop\Lab>javac TestQueueString
error: Class names, 'TestQueueString', are only accepted if annotation processing is
explicitly requested 1 error

任何帮助将不胜感激。

编辑

当我使用java 而不是javac 时,它总是要求我猜的主要方法:

C:\Users\TRI\Desktop\Lab>java -cp DAT.jar;Exceptions.jar TestQueueString
Exception in thread "main" java.lang.NoClassDefFoundError: TestQueueString
Caused by: java.lang.ClassNotFoundException: TestQueueString
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        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: TestQueueString.  Program will exit.

请注意,它确实会在编译后生成 .class 文件:)

【问题讨论】:

    标签: java


    【解决方案1】:

    您正在调用编译器javac运行您的程序。您通过java 运行程序,而不是javac。你的第二个命令应该是:

    java -cp DAT.jar;Exceptions.jar TestQueueString
    

    注意“java”上没有“c”,我已经添加了类路径,因为你在编译时添加了它。


    重新编辑:问题正是它所说的:它找不到类TestQueueString。我可以想到两个可能的原因:

    1. 当前目录不在你的类路径中;试试:

      java -cp DAT.jar;Exceptions.jar;. TestQueueString
      

      (注意类路径末尾的;.。)

    2. 您的TestQueueString.java 文件有一个package 声明。如果是这样,您需要告诉 java 类的全名(例如,foo.TestQueueString 而不仅仅是 TestQueueString 如果它在包 foo 中),并且文件必须相对于当前工作目录(再次假设包 foo,类文件必须在 foo 子目录中)。

    鉴于您引用的错误消息,并假设您使用的是最新版本的 Java,我猜是 #1,因为 #2 会说类似

    线程“main”java.lang.NoClassDefFoundError 中的异常:TestQueueString(错误名称:foo/TestQueueString)

    ...(注意“错误名称”位)如果包是foo

    【讨论】:

    • 它仍然没有帮助。请参阅我上面的编辑:) 谢谢您的回答。
    • @Trisism:编辑改变了问题。我已编辑答案以反映新问题。
    • T.J.Crowder: "java -cp DAT.jar;Exceptions.jar TestQueueString" 导致同样的错误...):
    • 而TestQueueString.java只有几行,只是一个调用QueueStringBlock实现的构造函数,即q.enqueue()、q.dequeue()等。它根本没有包声明。
    • @Trisism:抱歉,我在编辑的#1 中有一个错误,我有点忘了在类路径中添加.(这是#1 的重点)。如果不是这样,很明显你需要在问题中发布TestQueueString.java的全部内容。
    【解决方案2】:

    您将 Classpath 设置为 Dat.jar 和 Exception.jar,本质上是告诉 JVM 在这些位置查找 .class 文件。但是,TestQueueString 不在任何一个 .jar 文件中。它在您的当前目录中。由于您告诉 JVM 在 .jar 中查找 .class 文件,因此它不会检查您的当前目录。 逐步分解,这一行:

    java -cp DAT.jar;Exceptions.jar TestQueueString
    

    说:运行一个 java 程序,使用 TestQueueString 类中的 main 方法,并在 Dat.jar 和 Exceptions.jar 中搜索 .class 文件。 你可以做的是添加“.;”到 Classpath 的开头,它告诉 JVM 也在当前目录中搜索。

    【讨论】:

      猜你喜欢
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 2022-06-16
      相关资源
      最近更新 更多