"ClassNotFoundException" 尝试 运行 .jar 文件

"ClassNotFoundException" while trying to run .jar file

我有一个 .jar,是我根据 Oracle 文档使用 jar cfm hangman.jar Manifest.txt src/classes/app/Main.class 构建的。 manifest.txt 文件包含 Main-Class 作为 classes.app.Main,告诉我的 Main class 在哪里。执行时抛出ClassNotFoundException,表示找不到classes.app.Main。我需要帮助来理解这里出了什么问题。它是主要 class 还是缺少 class 路径?

这是项目树:

.
├── hangman.jar
├── Manifest.txt
├── README.md
└── src
    ├── app
    │   ├── Main.java
    │   ├── Player.java
    │   ├── Players.java
    │   ├── Play.java
    │   ├── Themes.java
    │   ├── Word.java
    │   └── Words.java
    └── classes
        └── app
            ├── Main.class
            ├── Play.class
            ├── Player.class
            ├── Players.class
            ├── Themes.class
            ├── Word.class
            └── Words.class


您没有显示代码,但极有可能您的 class 的包只是 app 而不是 classes.app,并且 classes 只是包含 class 文件的目录名称,实际上不是包层次结构的一部分。 jar 中 class 文件条目的名称,或相对于 classpath 目录的 class 文件的名称,必须恰好等于包层次结构的目录路径(如果any) 加上 class 名称和后缀 .class,不添加或删除任何内容。这意味着您的 jar 应该通过 转到 classes 目录,然后添加相对于该目录的文件 :

 jar cfm hangman.jar Manifest.txt -C classes app/Main.class 

并且清单中的 Main-class 条目应该是 app.Main。如果你只需要清单中的 main-class 而没有其他的(版本,IIRC 除外),你可以让 jar 为你创建它:

 jar cfe hangman.jar app.Main -C classes app/Main.class

我还注意到您的源代码树中还有其他 classes。如果这些 classes 被 Main class 直接或间接(即嵌套)调用或引用,它们也必须在 jar 中。您可能想改用 app/*,尽管您可能想要甚至需要更有选择性。

Meta:我认为这在标准教程中已涵盖,但尽管大部分内容都在那里,但在我能找到和参考的任何地方都没有真正整合在一起。