1. 概述

在命令行编译Java程序时,期望任何预期的命令行选项或参数不匹配都会导致错误。

在这个教程中,我们将首先探讨"Class Names Are Only Accepted if Annotation Processing Is Explicitly Requested"错误。然后,我们将看看其他一些常见的编译错误。

2. 错误示例

假设我们有以下类DemoClass

package com.baeldung;

public class DemoClass {
    // fields and methods
}

现在,尝试使用[javac](/javac)命令编译DemoClass

javac DemoClass

上述命令将给出一个错误:

error: Class names, 'DemoClass', are only accepted if annotation processing is explicitly requested
1 error

这个错误似乎与注解处理有关,而且有些难以理解,因为DemoClass中并没有涉及注解处理的相关代码。实际上,这个错误的原因是DemoClass不是一个注解处理源文件。

注解处理源文件是一种在编译时生成额外源代码的便捷方法。与标准的Java源文件不同,编译这些源文件时不需要提供.java扩展名。

3. 解决问题

让我们再次使用正确的文件扩展名.java来编译DemoClass

javac DemoClass.java

如预期,我们将得到源文件编译成DemoClass.class文件。

4. 其他提示和技巧

虽然当我们知道正确编译方式时,这个问题很容易解决,但在编译或运行应用程序时,我们仍然可能会遇到类似的问题。

4.1. 使用错误的文件扩展名

现在,尝试使用以下带有拼写错误的命令来编译源文件,即将".JAVA"全部大写:

javac DemoClass.JAVA

这将产生我们之前看到的相同错误消息:

error: Class names, 'DemoClass.JAVA', are only accepted if annotation processing is explicitly requested
1 error

4.2. 主类错误

假设我们有一个具有main方法的DemoApplication类:

public class DemoApplication {

    public static void main(String[] args) {
        System.out.println("This is a DemoApplication");
    }
}

现在,使用java命令执行应用程序:

java DemoApplication.class

结果是一个ClassNotFoundException

Error: Could not find or load main class DemoApplication.Class
Caused by: java.lang.ClassNotFoundException: DemoApplication.Class

现在,尝试不带任何扩展名(甚至不是.class.java)运行应用程序:

java DemoApplication

我们应该能在控制台上看到输出:

This is a DemoApplication

5. 总结

在这篇文章中,我们了解了在命令行上编译类时,错误地使用或省略.java文件扩展名如何导致错误。同时,我们也看到了与编译和运行独立应用程序时命令行参数使用不当相关的其他一些错误。


« 上一篇: JMeter中的 Basic认证
» 下一篇: JPA Buddy指南