"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:我认为这在标准教程中已涵盖,但尽管大部分内容都在那里,但在我能找到和参考的任何地方都没有真正整合在一起。
我有一个 .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:我认为这在标准教程中已涵盖,但尽管大部分内容都在那里,但在我能找到和参考的任何地方都没有真正整合在一起。