尝试运行.jar文件时出现“ ClassNotFoundException”

问题描述

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

这是项目树:

.
├── 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


解决方法

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

classes

,清单中的 jar cfm hangman.jar Manifest.txt -C classes app/Main.class 项应为Main-class。如果您只需要清单中的main-class而没有其他内容(版本,IIRC除外),则可以app.Main为您创建它:

jar

我还注意到源代码树中还有其他类。如果直接或间接(即嵌套)从Main类调用或引用了这些类,则它们也必须位于jar中。您可能想使用 jar cfe hangman.jar app.Main -C classes app/Main.class 来代替,尽管您可能想要甚至需要更具选择性。

元:我认为这已在标准教程中进行了介绍,但是尽管其中的大部分内容都存在,但它们在我能找到并参考的任何地方并没有真正融合在一起。