[英]"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 類在哪里。 執行時,拋出 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 中的類文件條目的名稱,或相對於類路徑目錄的類文件的名稱,必須正好是等於包層次結構(如果有)加上類名和后綴.class
的目錄路徑,其中沒有添加或刪除任何內容。 這意味着您的 jar 應該通過轉到classes
目錄然后添加相對於該目錄的文件來創建:
jar cfm hangman.jar Manifest.txt -C classes app/Main.class
清單中的Main-class
條目應該是app.Main
。 如果您只需要清單中的主類而不需要其他任何東西(除了版本,IIRC),您可以讓jar
為您創建它:
jar cfe hangman.jar app.Main -C classes app/Main.class
我還注意到您的源代碼樹中還有其他類。 如果從 Main 類直接或間接(即嵌套)調用或引用這些類,則它們也必須在 jar 中。 您可能希望改用app/*
,盡管您可能希望甚至需要更具選擇性。
Meta:我認為標准教程中已經涵蓋了這一點,但是盡管大部分內容都在那里,但它們並沒有在我能找到和參考的任何地方真正整合在一起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.