2012-08-23 118 views
0

這是一個典型的錯誤消息,但沒有搜索結果可以幫助我。我正在嘗試構建&運行某人編碼的java工具。JAR:找不到主類

我得到以下錯誤:

Could not find the main class: ConnJKSEngine. Program will exit. 

這裏是我的清單:

Main-Class: ConnJKSEngine 

我也改變了這

Main-Class: ConnJKSEngine.ConnJKSEngine 

Main-Class: ConnJKSEngine/ConnJKSEngine 

(它在最後有一個換行符)。沒有任何區別

我這是怎麼建的jar:

javac -cp ConnJKSEngine/ ConnJKSEngine/ConnJKSEngine.java 
jar -cvfm ConnJKSEngine.jar ConnJKSEngine/ConnJKSEngineManifest ConnJKSEngine/*.class 
chmod +x ConnJKSEngine.jar 

這是我嘗試運行jar(試過所有的人):

java ConnJKSEngine.jar 
java -jar ConnJKSEngine.jar 
java -cp ConnJKSEngine.jar ConnJKSEngine 

這是由jar -tf ConnJKSEngine.jar

META-INF/ 
META-INF/MANIFEST.MF 
ConnJKSEngine/ConnJKSEngine.class 
ConnJKSEngine/ConnJKSEngine_GenKey.class 
ConnJKSEngine/ConnJKSEngine_GetPubKey.class 
ConnJKSEngine/ConnJKSEngine_Operation.class 
ConnJKSEngine/ConnJKSEngine_PrivDec.class 
ConnJKSEngine/ConnJKSEngine_Sign.class 

給出表的內容我已經改變爲ConnJKSEngine目錄並執行java ConnJKSEngine,它可以正確打印使用信息。這使我確信主類存在並且可以被執行。所以建造這個罐子一定是錯的,對吧?

因此,我繼續解壓縮jar到不同的目錄(unzip ConnJKSEngine.zip),並得到了上面顯示的目錄結構。如果我進入ConnJKSEngine目錄並執行java ConnJKSEngine,它會正確執行。

在這裏,我卡住了:類在那裏,它在子目錄中,它可以被執行。清單似乎是正確的。由於我不是一名Java程序員,我現在來到這裏。任何想法可能會發生什麼? (注:Linux系統)

編輯源可以在這裏找到:https://github.com/Javex/JKSEngine

+0

您是否試圖聯繫該軟件的編碼器或生產者或當前支持該代碼的任何實體? –

+0

給你有來源? – Toilal

+0

是的,但他現在沒有時間研究這個問題,也不知道他的頭頂。 – javex

回答

1

我認爲你的主類應該有完全合格的名稱ConnJKSEngine.ConnJKSEngine或您的JAR的內容應該是這樣的:

META-INF/ 
META-INF/MANIFEST.MF 
ConnJKSEngine.class 
ConnJKSEngine_GenKey.class 
ConnJKSEngine_GetPubKey.class 
ConnJKSEngine_Operation.class 
ConnJKSEngine_PrivDec.class 
ConnJKSEngine_Sign.class 
+0

好吧,這是一個很好的方法:我設法通過更改爲'ConnJKSEngine'目錄並在那裏構建它。但是如果我想要在該目錄之外創建它(因爲更改主類沒有幫助,可以看到上面的內容) – javex

+0

您可以在創建jar文件時嘗試'-C'選項來更改目錄。 – gkuzmin

+0

好吧,我現在這樣做:'cd ConnJKSEngine && jar -cvfm ConnJKSEngine.jar ConnJKSEngineManifest * .class && mv ConnJKSEngine.jar .. && cd ..',完美地工作。感謝您的建議。我確實嘗試過-C,但似乎我必須爲每個文件單獨執行此操作。這太多的工作,所以我會堅持下去,這是更容易:) – javex

0

如果ConnJKSEngine處於默認包(無包語句)中,則ConnJKSEngine.class和所有其他類都應位於jar文件的根目錄中。

0

UPDATE

鑑於這句話

I've changed to the ConnJKSEngine directory and executed java ConnJKSEngine, it correctly prints usage information

我猜完整的類名稱就是ConnJKSEngine,即沒有任何包裝。在這種情況下,清單類需要聲明

Main-Class: ConnJKSEngine 

按你的第一次嘗試,但你做了錯包,即所有的類必須直接放在存檔,而不是在一個命名的子目錄該項目(似乎爲了避免名稱衝突,開發者在前綴 - 壞習慣前加上了每個類實際名稱)。所以,你需要把你所有的* .class文件的JAR這樣

META-INF/ 
META-INF/MANIFEST.MF 
ConnJKSEngine.class 
ConnJKSEngine_GenKey.class 
ConnJKSEngine_GetPubKey.class 
ConnJKSEngine_Operation.class 
ConnJKSEngine_PrivDec.class 
ConnJKSEngine_Sign.class 

你可以嘗試下面的命令

# change to project directory 
cd ConnJKSEngine 
# compile every *.java file 
javac *.java 
# build the final archive 
jar cmvf jksengine-1.0.jar ConnJKSEngineManifest *.class 

這裏是javac(編譯器)和jar(歸檔)文檔

+0

我已經這樣做(澄清上面的帖子) – javex

0

The manifest text file must end with a new line or carriage return. The last line will not be parsed properly if it does not end with a new line or carriage return.