読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

jarを比較するスクリプト

Ruby

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」をどこかに入れればとりあえず対処できるかと。