jarを比較するスクリプト
jarを比較する必要があったので、ちょろっとスクリプトを書きました。
- jarを展開して、
- 各ファイルをmd5sumで比較。
- 違っていたら、
- クラスファイルはjavapの出力結果をdiffで比較
- それ以外は、ファイル自体をdiffで比較。
使い方
$ diffjar.rb <比較するjarファイルのパス1> <比較するjarファイルのパス2>
ソース
#!/usr/bin/ruby require 'fileutils' def extract( dir, jar ) jar = File.expand_path jar current = FileUtils.pwd FileUtils.rm_rf dir FileUtils.mkdir_p dir FileUtils.cd dir system( "jar xvf #{jar} > /dev/null" ) FileUtils.cd current end def diff( a, b ) Dir.glob( "#{a}/**/*" ).map{|i| i.sub(a, "")}.each {|i| next if File.directory? "#{a}#{i}" if `md5sum '#{a}#{i}'`[0..32] != `md5sum '#{b}#{i}'`[0..32] puts "\n----\ndiffer : #{a}#{i} #{b}#{i}" if ( i =~ /\.class$/ ) cl = i.gsub(/\//, ".")[1 .. -7] file = i.gsub(/\//, "_") system( "javap -c -classpath #{a} '#{cl}' > './a_#{file}.txt'" ) system( "javap -c -classpath #{b} '#{cl}' > './b_#{file}.txt'" ) system( "diff -r './a_#{file}.txt' './b_#{file}.txt'" ) else system( "diff -r ./a#{i} ./b#{i}" ) end end } end extract( "./a", ARGV[0] ) extract( "./b", ARGV[1] ) puts "diff : #{ARGV[0]} #{ARGV[1]}" diff( "./a", "./b" )
今気がついたけど、これだと「片方のjarにのみ含まれるファイル」を違いとして検出できないなー。気になる場合は「diff ./a ./b」をどこかに入れればとりあえず対処できるかと。