对 java 命令进行故障排除
此示例涵盖使用’java’命令时的常见错误。
没有找到指令
如果你收到如下错误消息:
java: command not found
在尝试运行 java
命令时,这意味着 shell 的命令搜索路径上没有 java
命令。原因可能是:
- 你根本没有安装 Java JRE 或 JDK,
- 你还没有在 shell 初始化文件中更新
PATH
环境变量(正确),或者 - 你还没有获取当前 shell 中的相关初始化文件。
有关你需要执行的步骤,请参阅 “安装 Java” 。
无法找到或加载主类
如果 java
命令无法找到/加载你指定的入口点类,则会输出此错误消息。一般而言,这可能有三个原因:
- 你已指定了不存在的入口点类。
- 该类存在,但你指定的不正确。
- 该类存在并且你已正确指定它,但 Java 无法找到它,因为类路径不正确。
以下是诊断和解决问题的过程:
-
找出入口点类的全名。
- 如果你有类的源代码,则全名由包名称和简单类名组成。
Main
类的实例在包“com.example.myapp”中声明,然后其全名是“com.example.myapp.Main”。 - 如果你有一个已编译的类文件,你可以通过运行
javap
找到类名。 - 如果类文件位于目录中,则可以从目录名称推断出完整的类名。
- 如果类文件位于 JAR 或 ZIP 文件中,则可以从 JAR 或 ZIP 文件中的文件路径推断出完整的类名。
- 如果你有类的源代码,则全名由包名称和简单类名组成。
-
查看
java
命令的错误消息。该消息应以java
尝试使用的完整类名结束。- 检查它是否与入口点类的完整类名完全匹配。
- 它不应该以“.java”或“.class”结尾。
- 它不应包含斜杠或 Java 标识符 1 中 不合法的任何其他字符。
- 名称的大小写应与完整的类名完全匹配。
-
如果你使用正确的类名,请确保该类实际上在类路径上:
- 计算出类名映射到的路径名; 请参阅将类名映射到路径名
- 弄清楚类路径是什么; 请参阅此示例: 指定类路径的不同方法
- 查看类路径上的每个 JAR 和 ZIP 文件,看它们是否包含具有所需路径名的类。
- 查看每个目录以查看路径名是否解析为目录中的文件。
如果手动检查类路径没有找到问题,可以添加 -Xdiag
和 -XshowSettings
选项。前者列出了所有加载的类,后者列出了包含 JVM 有效类路径的设置。
最后,这个问题有一些不明原因:
- 具有
Main-Class
属性的可执行 JAR 文件,该属性指定不存在的类。 - 具有错误
Class-Path
属性的可执行 JAR 文件。 - 如果你在类名之前搞乱了 2 个 选项,
java
命令可能会尝试将其中一个解释为类名。 - 如果有人忽略了 Java 样式规则并使用了仅在字母大小写方面不同的包或类标识符,并且你在平台上运行将文件名中的字母大小写视为不重要。
- 代码或命令行中类名中的同形字符问题。
“在类<name>中找不到主要方法”
当 java
命令能够找到并加载你指定的类但是无法找到入口点方法时,会发生此问题。
有三种可能的解释:
- 如果你尝试运行可执行 JAR 文件,则 JAR 的清单具有不正确的“Main-Class”属性,该属性指定的类不是有效的入口点类。
- 你告诉
java
命令一个不是入口点类的类。 - 入口点类不正确; 有关详细信息,请参阅入口点类 。
其他资源
1 - 从 Java 8 及更高版本开始,java
命令将有助于将文件名分隔符(“/”或“”)映射到句点(“。”)。但是,手册页中未记录此行为。
2 - 一个非常模糊的情况是,如果你从格式化文档中复制并粘贴命令,其中文本编辑器使用长连字符而不是常规连字符。