工作中發現的一個非常奇怪也很有趣事情,有關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前必須有不下兩個空格
以上兩個條件有一個不滿足都會出現問題,有點古怪。