打包文件 MANIFEST.MF 功能詳解


最近研究了如何在java工程打包,期間遇到的一些問題進行總結,如打包成test.jar 文件

Manifest-Version: 1.0 Main-Class: windows.VideoWindow Class-Path: lib\jetty-6.1.26.jar lib\aspectjweaver-1.6.12.jar

上面為打包為jar中的包說明文件. 下面這個報錯一直出現. could not find main class. Program will exit 這個錯誤提示其實不是沒有發現main class. 而是jar如果有錯誤執行不了,就會出現這個錯誤. 打包完成后, 要先運行 cmd -> java -jar your.jar 確認沒有問題即可執行jar. 使用-jar參數后, 系統的Classpath 變量不再起作用. 虛擬機將去MANIFEST.MF中的Class-Path 下找相關的包. 然后才能成功的從: windows.VideoWindow 的main方法進入. 否則沒有相關連接包,則會提示找不到main class. 而大家可能還迷糊的找不到北. 明明有main class嗎.

如果這個寫的不對. 則就會一直報錯. 看看上面這個Class-Path: 后面的寫法. 空格分開. 絕對不能有分號.切記.

最后必須有換行. 這個也是要注意的. 否則依然提示沒有mainclass.

不要因為這個小事情耽誤了時間. 其中 lib/ 表示這個jar必須在打包Test.jar所在目錄的一個lib子目錄中.

運行jar需要命令: java -jar Test.jar 雙擊也可以, 則使用 javaw 打開.

關於java -classpath a.jar;b.jar; class test.Test 執行時. a.jar;b.jar; 后面都必須有分號. 否則報錯. 不要指望不寫classpath讓系統自己找. 這不是在eclipse里面.必須寫上你要使用的類. 否則總會提示您編譯出錯.

2、MANIFEST.MF 文件中奇怪的分行和空格要求

工作中發現的一個非常奇怪也很有趣事情,有關MANIFEST.MF文件中的分行和空格的格式要求,分享給大家。

    對於通常的MANIFEST.MF文件,一般格式是:

Class-Path: lib/a.jar lib/b.jar lib/c.jar lib/d.jar lib/e.jar lib/f.jar     在一行之內將所有的jar包路徑寫上,空格分隔即可。

    但是對於一些大型的項目,因為依賴包眾多,比如大於30個,那么如果還寫在一行內,就會出現一個長度驚人的行。程序運行倒不會有任何問題,但是對於版本控制就很不友好,如增加或者減少一個依賴包,這行就會被改寫。以后compare不同版本時,只能知道這行被修改了確無法直接知道是做了什么修改,必須通過其他方式才能對比出來。

    同樣的問題發生在code merge時,如果兩個分支都修改了這個文件,就必須通過手工來進行merge,而且要對照出來彼此到底改了什么,很困難而且容易出錯。

    因此一個改進就是將這個文件中的依賴按照一行一個依賴的方式重寫,這樣以后修改時只會修改改依賴所在的行,很容易就對比出來具體做了哪些感動,code merge時版本控制軟件一般也很容易直接自動merge成功。

    修改后的文件類似如下:

Class-Path: lib/a.jar     lib/b.jar     lib/c.jar     lib/d.jar     lib/e.jar     lib/f.jar

    但是在實際操作時發生了意料之外的問題,會出現異常或者類無法找到,經檢查發現問題出現在MANIFEST.MF的格式上,MANIFEST.MF對於分行和空格是有特殊要求的:

1. 每行的最后一個jar的名稱后不容許有空格     即"    lib/b.jar"在b.jar后必須回車結束本行,不能有空格,一個都不能

2. 每行的開頭必須有不少於2個空格     即"    lib/b.jar"在b.jar前必須有不下兩個空格

    以上兩個條件有一個不滿足都會出現問題,有點古怪。

3、嚴格的MANIFEST.MF格式 今天才發現這個文件的格式要求比較嚴格,因為使用的包比較多,所以那個Class-path的內容就比較多,我全部放在了一行,結果服務器啟動讀取那個文件的時候報錯,錯誤信息是行太長,把它們切成多行,結果又是無效的頭字段(java.io.IOException: invalid header field),和工程里面的其它文件比較了下,發現換行后要在前面加一個空格,后來又發現明明包含了一個包,但是找不到類,又在每行的后面加了一個空格,這下才完全搞定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM