10

まったく同じソース ファイルから jar または zip をビルドすると、常に別のファイルが生成されるようです。Java jar コマンドと、ant の jar および zip タスクの両方を使用して、これを試しました。

これは、新しい jar/zip のタイムスタンプが保存されている各ファイルの現在の時刻に設定されていることが原因のようです。

zip ツールがファイルシステム上のファイルのタイムスタンプを単純に使用して、まったく同じソースからビルドされた jar がまったく同じように見えるようにする方法はありますか?

4

8 に答える 8

4

バイナリの違いは、マニフェスト ファイルのタイムスタンプが原因です。jar にマニフェスト自体を作成させると、その場でマニフェストが作成され、作成されたマニフェストが currentTimeMillis に設定されます。

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

于 2009-10-25T13:16:58.027 に答える
1

zipにそれを行わせる方法はないと思いますが、作成する前に、ファイルシステム上のファイルのタイムスタンプを既知の日付にハンマーで打つことができます(UNIXでは「touch」コマンドを使用します-Windowsでは何がわかりません)瓶。

于 2009-04-15T22:00:09.823 に答える
1

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

于 2009-04-16T10:58:47.150 に答える
1

わかりました、同僚と私は私たちのために働く解決策を思いつきました.

クラスまたはjarファイルを削除しないようにビルドプロセス全体を再設計する代わりに、次の手順を使用します。

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

ええ、それは不親切に聞こえることは知っていますが、これを考慮してビルドスクリプトを書き直すよりも確実です。また、新しいマシンで完全にクリーンなビルドを行うことができ (サーバー障害の場合)、このプロセスにより、実際に更新された jar のみが確実に生成されます。

于 2009-04-21T21:26:51.193 に答える