工作中發(fā)現(xiàn)的一個(gè)非常奇怪也很有趣事情,有關(guān)MANIFEST.MF文件中的分行和空格的格式要求,分享給大家。
對(duì)于通常的MANIFEST.MF文件,一般格式是:
Class-Path: lib/a.jar lib/b.jar lib/c.jar lib/d.jar lib/e.jar lib/f.jar
在一行之內(nèi)將所有的jar包路徑寫(xiě)上,空格分隔即可。
但是對(duì)于一些大型的項(xiàng)目,因?yàn)橐蕾嚢姸啵热绱笥?0個(gè),那么如果還寫(xiě)在一行內(nèi),就會(huì)出現(xiàn)一個(gè)長(zhǎng)度驚人的行。程序運(yùn)行倒不會(huì)有任何問(wèn)題,但是對(duì)于版本控制就很不友好,如增加或者減少一個(gè)依賴包,這行就會(huì)被改寫(xiě)。以后compare不同版本時(shí),只能知道這行被修改了確無(wú)法直接知道是做了什么修改,必須通過(guò)其他方式才能對(duì)比出來(lái)。
同樣的問(wèn)題發(fā)生在code merge時(shí),如果兩個(gè)分支都修改了這個(gè)文件,就必須通過(guò)手工來(lái)進(jìn)行merge,而且要對(duì)照出來(lái)彼此到底改了什么,很困難而且容易出錯(cuò)。
因此一個(gè)改進(jìn)就是將這個(gè)文件中的依賴按照一行一個(gè)依賴的方式重寫(xiě),這樣以后修改時(shí)只會(huì)修改改依賴所在的行,很容易就對(duì)比出來(lái)具體做了哪些感動(dòng),code merge時(shí)版本控制軟件一般也很容易直接自動(dòng)merge成功。
修改后的文件類似如下:
Class-Path: lib/a.jar
lib/b.jar
lib/c.jar
lib/d.jar
lib/e.jar
lib/f.jar
但是在實(shí)際操作時(shí)發(fā)生了意料之外的問(wèn)題,會(huì)出現(xiàn)異常或者類無(wú)法找到,經(jīng)檢查發(fā)現(xiàn)問(wèn)題出現(xiàn)在MANIFEST.MF的格式上,MANIFEST.MF對(duì)于分行和空格是有特殊要求的:
1. 每行的最后一個(gè)jar的名稱后不容許有空格
即" lib/b.jar"在b.jar后必須回車(chē)結(jié)束本行,不能有空格,一個(gè)都不能
2. 每行的開(kāi)頭必須有不少于2個(gè)空格
即" lib/b.jar"在b.jar前必須有不下兩個(gè)空格
以上兩個(gè)條件有一個(gè)不滿足都會(huì)出現(xiàn)問(wèn)題,有點(diǎn)古怪。