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
文件扩展名如何导致错误。同时,我们也看到了与编译和运行独立应用程序时命令行参数使用不当相关的其他一些错误。