问题描述
我有一个.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
来代替,尽管您可能想要甚至需要更具选择性。
元:我认为这已在标准教程中进行了介绍,但是尽管其中的大部分内容都存在,但它们在我能找到并参考的任何地方并没有真正融合在一起。