2009-04-15 103 views
6

看起來,從完全相同的源文件構建jar或zip文件總是會產生不同的文件。我試着使用java jar命令,以及ant和jar和zip任務。Zip/Jar文件中的二進制差異

這似乎是由於新的罐子/拉鍊在每個存儲文件上都有時間戳設置爲當前時間。

有沒有辦法強制一個壓縮工具簡單地使用文件系統上的文件的時間戳,以確保從完全相同的源生成的jar將完全相同?

+0

如果您在尋找構建確定性JAR(可重複SHA1簽名)的分步說明,請參閱以下文章:http: //gary-rowe.com/agilestack/2013/08/08/how-to-create-a-deterministic-jar/ – 2013-08-07 21:25:55

+0

JAR比ZIP一個稍微不同的格式。 JAR基於ZIP,但它包含清單文件和簽名,而ZIP不是。 – jww 2014-12-26 06:28:23

回答

1

好吧,我的同事想出了一個適合我們的解決方案。

而是再造我們的整個構建過程不會刪除任何類或jar文件中,我們使用這個程序:

  1. 建立新的文物。
  2. 使用jardiff(jnlp的一部分)來比較先前構建的更改。
  3. 如果jardiff產生差異罐子沒有變化,擺脫以前的版本神器。

是的,我知道它聽起來很爛,但它肯定會跳過重寫構建腳本來考慮這一點。另外,我們可以做一個完全乾淨的構建一個新的機器(在服務器發生故障的情況下),並且這一過程將確保只有實際更新的罐子生產。

1

我不認爲有辦法使zip做到這一點,但你肯定可以錘擊文件系統上的文件的時間戳到一個已知的日期(使用unix下的'touch'命令 - 我不知道在Windows下是什麼)在你創建jar之前。

+1

有在Windows上使用觸摸utils的。但據我所知,這並不能解決問題。這個問題似乎表明,zip中的條目獲取CURRENT TIME,而不是文件上的時間。 Touch不會解決這個問題。 – Cheeso 2009-04-16 02:46:00

1

我有一個類似的問題,並且,正如pjz所示,我通過在將文件添加到jar之前「觸摸」文件來解決它(所以,它對我有用:-))。如果你需要的話,你可以在GNU Windows Utilities,核心utils:http://gnuwin32.sourceforge.net/packages/coreutils.htm上找到適合Windows的觸摸,但對於這個單獨的應用程序來說它是一個很大的軟件包(儘管你可能會喜歡其他許多有用的工具),或者,下載如http://www.softpedia.com/progClean/Touch-for-Windows-Clean-41086.html

3

二進制差異是因爲清單文件的該時間戳。 如果讓罐子創建一個清單本身就會對 創建清單飛,並設置創建艙單的currentTimeMillis。

你可以解決它:
1.不要添加一個清單(如果您使用的螞蟻,你必須改用罐子郵編)
2.添加清單像你添加普通文件。 (所以清單是文件系統上的一個文件,並且不是即時創建的)

相關問題