JD-CLIについて
コマンドライン上で叩いて、コマンドライン上に結果が出力される__Java__ __デコンパイラー__です。
JDについて
Eclipseでも使用されているJava5以降のclassファイルもでコンパイル可能なJava デコンパイラー
(参照)JD Projectへ
JD-CLIは、そのJDで使用されているコアライブラリJD-Coreを使用させていただいています。
使用方法
こちらへ移動して
Assetsにある"jd-cli-windows-1.0.0.zip"のzipファイルをダウンロード。
解凍後すると中身はこのような感じです。
コマンドラインから、jd-cli [デコンパイルしたいファイル]で結果でます。
その他のオプションは以下の通り
> jd-cli.exe -h
example:
jd-cli(.exe) Example.class
jd-cli(.exe) -b example.jar org.aaa.Example.class
jd-cli(.exe) -b org\aaa Example.class
usage:
classes... : Specify the class files...
-b (--base) VAL : Specify the reference directory or Jar file.
-h (--help) : Show helps. (default: false)
-l (--loc) : Show full classpath. (default: false)
-m (--meta) : Show metadatas.(e.g. Filename, Java versions..) (default:false)
-n (--line) : Show Line Number. (default: false)
-r (--real) : Realignment Line Number. (default: false)
-u (--unicode) : Escapes Unicode Charset. (default: false)
WinMerge Pluginについて
解凍フォルダにあるWinMergePluginsというフォルダがあって、たどっていくと、exe用、jar用の2種類のフォルダがあります
たとえば、For exeの内容は、以下で
WinMergeがインストールされているのであれば、フォルダ内install.batを管理者権限で実行すると、インストールされているフォルダにコピーされます。
WinMergeを起動後、プラグイン設定にコピーした同名のファイル(この場合、jd_exe)が記載されていればOK
使用時に、展開プラグインで開く、自動展開を設定するなどしてご使用ください。
以下、最新common-lang3のcommons-lang3-3.10とcommons-lang3-3.11を比較した結果。
自動展開で、87013ms(317ファイル)くらいで比較します。
(ちなみにJarバージョンだと85174ms。およそ1ファイルに付き10ms早いみたいですね.java8以上入れておられて、パスが通っておられる方は、Jarバージョンのほうが早いかも。
ソースは...
JD-ECLIPSEソースをガン見して、良いところをリスペクト。そのまま持ってきたのもあります。(もちろんライセンス部分は消しませんよ。)
ファイル名フルパスが、デフォルトだったので、それだとdiffのとき全ファイル引っかかるため
フルパスでないバージョンも対応できるように直しました。
あと、ファイルパスにUNICODEが入っていた場合の置換処理が誤っていたので直しました。
(org/util/readerみたいなパスがorg//til/readerとなってしまっていたのを解消)
#余談
以下、余談ですが、、、
かぶってた...
作るとき調べて、無かったから作ったのですが、、、すでに同じことをされている方がおりました。。。
kwart/jd-cmd jd-cmd - Command line Java Decompiler
exe化してないくらいでほぼ同じ考え。出力パターンを変えられる分あちらのほうが高機能な感じ?
まぁ使い分けてくださいということで。。。
OSX, Linux版もあるけれど
JD-GUIのGradleを参考に作らせてもらったので、実はソースをチェックアウトして
gradlew build
すれば、Linux版もOSX版も出力されたりします。
でもテストしてないから前には出してません。なんとなくGUI特化のオプションが付いてそう。
最後に
久しぶりのJava関連の(というか記事自体の)更新。
WinMergeでclass比較したいという願望からはじめました。最後の最後で先人がいて、ずっこけましたが
jarのminify化だの、launch4jでのExec化だの、distributionsでのおまとめZip化だの、とても勉強になりました。
みなさんgradle使いこなしててすごいですね。。。