JD-Core を使って WinMerge Plugin 付きの コマンドラインインタフェース 作りました

![01_title.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105193/207f25a2-5866-0b46-48ae-d3eafc5aa735.jpeg)

# JD-CLIについて
コマンドライン上で叩いて、コマンドライン上に結果が出力される__Java__ __デコンパイラー__です。

## JDについて
Eclipseでも使用されているJava5以降のclassファイルもでコンパイル可能なJava デコンパイラー
[(参照)JD Projectへ](http://java-decompiler.github.io/ "JD Project")
JD-CLIは、そのJDで使用されているコアライブラリJD-Coreを使用させていただいています。

## 使用方法
[こちら](https://github.com/jd-wrapper/jd-cli/releases "JD-CLI リリースサイトへ")へ移動して
Assetsにある["jd-cli-windows-1.0.0.zip"](https://github.com/jd-wrapper/jd-cli/releases/download/v1.0.0/jd-cli-windows-1.0.0.zip "DL")のzipファイルをダウンロード。
解凍後すると中身はこのような感じです。
![02_arch.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105193/adb9270b-31b8-5b28-3340-5221a2533c97.jpeg)
コマンドラインから、jd-cli [デコンパイルしたいファイル]で結果でます。
![09_res_jd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105193/14fc2655-d4d8-27b0-8472-f2dde401de9a.jpeg)
その他のオプションは以下の通り

```
> 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の内容は、以下で
![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105193/6c2f2ded-2263-659d-4f3a-540aabf16c73.jpeg)
WinMergeがインストールされているのであれば、フォルダ内install.batを管理者権限で実行すると、インストールされているフォルダにコピーされます。
WinMergeを起動後、プラグイン設定にコピーした同名のファイル（この場合、jd_exe）が記載されていればOK
![10_jd_plugin.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105193/ac7bd683-8336-f820-fb81-03af721f8460.gif)
使用時に、展開プラグインで開く、自動展開を設定するなどしてご使用ください。

以下、最新common-lang3のcommons-lang3-3.10とcommons-lang3-3.11を比較した結果。
![04_res_exec.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105193/c0f8bf53-0113-d3f5-d26d-47a2463c7beb.gif)
自動展開で、87013ms（317ファイル）くらいで比較します。
（ちなみにJarバージョンだと85174ms。およそ1ファイルに付き10ms早いみたいですね.java8以上入れておられて、パスが通っておられる方は、Jarバージョンのほうが早いかも。

## ソースは...
[JD-ECLIPSE](https://github.com/java-decompiler/jd-eclipse/releases)ソースをガン見して、良いところをリスペクト。そのまま持ってきたのもあります。（もちろんライセンス部分は消しませんよ。）
ファイル名フルパスが、デフォルトだったので、それだとdiffのとき全ファイル引っかかるため
フルパスでないバージョンも対応できるように直しました。
あと、ファイルパスにUNICODEが入っていた場合の置換処理が誤っていたので直しました。
（org/util/readerみたいなパスがorg//til/readerとなってしまっていたのを解消）

#余談
以下、余談ですが、、、
## かぶってた...
作るとき調べて、無かったから作ったのですが、、、すでに同じことをされている方がおりました。。。

[kwart/jd-cmd](https://github.com/kwart/jd-cmd/releases/tag/jd-cmd-1.1.0.Final) 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使いこなしててすごいですね。。。