对 java 命令进行故障排除

此示例涵盖使用’java’命令时的常见错误。

没有找到指令

如果你收到如下错误消息:

java: command not found

在尝试运行 java 命令时,这意味着 shell 的命令搜索路径上没有 java 命令。原因可能是:

  • 你根本没有安装 Java JRE 或 JDK,
  • 你还没有在 shell 初始化文件中更新 PATH 环境变量(正确),或者
  • 你还没有获取当前 shell 中的相关初始化文件。

有关你需要执行的步骤,请参阅 “安装 Java”

无法找到或加载主类

如果 java 命令无法找到/加载你指定的入口点类,则会输出此错误消息。一般而言,这可能有三个原因:

  • 你已指定了不存在的入口点类。
  • 该类存在,但你指定的不正确。
  • 该类存在并且你已正确指定它,但 Java 无法找到它,因为类路径不正确。

以下是诊断和解决问题的过程:

  1. 找出入口点类的全名。

    • 如果你有类的源代码,则全名由包名称和简单类名组成。Main 类的实例在包“com.example.myapp”中声明,然后其全名是“com.example.myapp.Main”。
    • 如果你有一个已编译的类文件,你可以通过运行 javap 找到类名。
    • 如果类文件位于目录中,则可以从目录名称推断出完整的类名。
    • 如果类文件位于 JAR 或 ZIP 文件中,则可以从 JAR 或 ZIP 文件中的文件路径推断出完整的类名。
  2. 查看 java 命令的错误消息。该消息应以 java 尝试使用的完整类名结束。

    • 检查它是否与入口点类的完整类名完全匹配。
    • 它不应该以“.java”或“.class”结尾。
    • 它不应包含斜杠或 Java 标识符 1 中 不合法的任何其他字符。
    • 名称的大小写应与完整的类名完全匹配。
  3. 如果你使用正确的类名,请确保该类实际上在类路径上:

    • 计算出类名映射到的路径名; 请参阅将类名映射到路径名
    • 弄清楚类路径是什么; 请参阅此示例: 指定类路径的不同方法
    • 查看类路径上的每个 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 - 一个非常模糊的情况是,如果你从格式化文档中复制并粘贴命令,其中文本编辑器使用长连字符而不是常规连字符。