以下の2つのファイルをバイナリ比較したところ差分がでました。
・jarファイルA
・jarファイルB(ソースはAと全く同じもの)
コンパイルするときの時間などによって変わってくるものなのでしょうか。
ご存じのかたおりましたらよろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
T.Kannoさんが回答されている通り、JarファイルはZip形式のファイルなので、ファイルの作成日付(タイムスタンプ)が異なると中身が全く同じでもアーカイブ後のファイルにはバイナリ差分が生じます。
ただ、通常のZipファイルの場合であれば、全く同じディレクトリツリー(タイムスタンプも同じ)を固め直した場合にはバイナリ差分が生じないはずですよね?
しかし、JarファイルにはZipファイルと異なり、マニフェストファイル が含まれています。
META-INF/MANIFEST.MF
このマニフェストファイルはオリジナルのファイルを含めることもできますが、何も指定しないとJarコマンドがデフォルトのマニフェストファイルを生成して埋め込みます。
つまり、Jarファイルの場合、全く同じソースであっても、アーカイブ時にマニフェストファイルは 毎回生成される(=中身は同じでも必ずタイムスタンプが更新される)ので、アーカイブファイル自体としては必ずバイナリ差分が発生することになります。
ですので、Jarファイルの中身が同一であることを確かめるには、アーカイブを解凍して内容同士を比較する必要があります。
もっとも、もしシェルにBashを使用しているのであればプロセス置換が使用可能なので、簡易的には以下のように作業ディレクトリへ解凍すること無く直に突合することもできます。
Bash
1diff -qr <( jar -x0f A.jar ) <( jar -x0f B.jar )
投稿2015/11/13 06:24
総合スコア5936
0
コンパイラやjarアーカイバもまったく同じものを使っていますか? これらが違えばバイナリレベルでは違いが出てくるでしょう。oracleのJDKとopenjdkではかなり違ったclassファイルができたのを見たことがあります。
デバッグ情報をclassファイルに入れるかどうかの設定(javacコマンドの-gオプション)でもclassファイルの中身が違ってきます。
参考になりますでしょうか?
投稿2015/11/17 07:05

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
コンパイラのバージョン違いや、コンパイルオプションの違いの可能性もありそうです。
投稿2015/11/12 21:59
総合スコア306
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
class ファイルの内容に差がでる原因として, こんな例があるようです。
参考情報
- なぜ違うクラスファイルが生成される? http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1328780558
- classファイルに差分が発生してしまう http://qa.atmarkit.co.jp/q/6840
投稿2015/11/12 15:07
編集2015/11/12 15:08総合スコア22328
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/15 10:01