2009-04-15 51 views
6

まったく同じソースファイルからjarファイルまたはzipファイルを作成すると、常に別のファイルが生成されるようです。私はこの両方をjava jarコマンドとantのjarとzipタスクを使って試しました。Zip/Jarファイルのバイナリ差分

新しいjars/zipには、保存されている各ファイルのタイムスタンプが現在の時刻に設定されているためです。

zipツールがファイルシステム上のファイルに対してタイムスタンプを使用するように強制する方法はありますか?まったく同じソースから作成されたjarファイルが完全に同じになるようにしますか?

+0

確定的なJAR(繰り返し可能なSHA1署名)を作成するためのステップごとの手順を探している場合は、次の記事を参照してください。http: //gary-rowe.com/agilestack/2013/08/08/how-to-create-a-deterministic-jar/ –

+0

JARはZIPとは少し異なる形式です。 JARはZIPに基づいていますが、ZIPはそうではありませんが、マニフェストファイルと署名が含まれています。 – jww

答えて

1

[OK]を、同僚と私たちのために動作するソリューションを思い付いた。

  1. が新しい成果物をビルドします。代わりに、任意のクラスまたはjarファイルを削除しないように私達の全体のビルドプロセスリエンジニアリングの

    は、私たちは、この手順を使用します。

  2. jardiff(jnlpの部分)を使用して、以前のビルドの変更を比較します。
  3. jardiffが生成するdiff jarに変更がない場合は、前のビルドからアーティファクトを取得します。

ええ、私はそれがクルージングのように聞こえることは知っていますが、これを考慮に入れてビルドスクリプトを書き直すのは間違いありません。また、新しいマシン(サーバーの障害の場合)で完全にクリーンなビルドを実行できます。このプロセスでは、実際に更新されたjarファイルのみが生成されます。

1

私はzipを作成する方法はないと思うが、ファイルシステム上のファイルのタイムスタンプを既知の日付にハンマーすることができます(UNIXの 'touch'コマンドを使用します。 )を作成します。

+1

Windows上で利用可能なタッチユーティリティがあります。しかし、これは私が理解しているように、問題を解決することはできません。問題は、zip内のエントリがファイル上の時間ではなく、現在の時間を取得すると言うようです。タッチはそれを修正しません。 – Cheeso

+0

実際の問題は、ファイルを再生すると、たとえ同じ内容のファイルを生成したとしても、最後の再生のmtimeタイムスタンプを取得するため、zipにmtimeが格納されているので、内容が同じであっても異なることになる。 – pjz

+0

Cheesoは正しいです。まったく同じソースファイルを取得してjarを2回構築するだけでも、jarファイル内のタイムスタンプは変更されます。 –

1

私は同様の問題があり、pjzの示唆しているように、ファイルをジャーに追加する前にファイルに触れて解決しました。必要ならば、Windowsのユーティリティであるcore utils:http://gnuwin32.sourceforge.net/packages/coreutils.htmのいずれかで、Windows用のタッチを見つけることができますが、この単一のものの大きなパッケージです(他にも便利なユーティリティがたくさんあります)。 http://www.softpedia.com/progClean/Touch-for-Windows-Clean-41086.htmlのようなものをダウンロードしてください。

+0

私はこれをまず試しました、悲しいことに、これはうまくいきません。上記のCheesoのコメントを参照してください。 –

3

2進数の違いは、マニフェストファイルのタイムスタンプのためです。 jarにマニフェストを作成させる場合は、 にマニフェストを作成し、作成したマニフェストをcurrentTimeMillisに設定します。

次の方法でそれを解決することができます
2.(あなたの代わりにjarファイルのzipファイルを使用する必要があります使用して蟻場合)マニフェストを追加しないでください
1.あなたは、通常のファイルを追加するようにマニフェストを追加します。