やり方
タイトル通りですが、jar ファイルをまとめてデコンパイルする方法を2通り説明します。
JD GUI を使う
JD (Java Decompiler) の GUI 版である JD GUI を使います。
まずは以下のページからダウンロードします。
あとは以下の手順で OK です。
- File -> Open File で、デコンパイルしたい jar ファイルを選びます
- File -> Save All Sources で、出力先を選ぶと、ソースファイルが固まった zip ファイルが出力されます。
IntteliJ IDEA に同梱の FernFlower decompiler を使う
IntelliJ IDEA には Java のデコンパイル機能があります。内部的には「FernFlower decompiler」なるものを使っているようです。ただ、IntelliJ IDEA の GUI では、クラスファイルをデコンパイルしてソースを表示してくれる機能はあるものの、JD GUI のように jar ファイルをまとめてソースコードに変換する事が出来ません。そのため、デコンパイラーの jar ファイルを直接使用します。
手元の Mac では以下のように実行したら出来ました。
java -cp /Users/kashima/Applications/IntelliJ\ IDEA\ Ultimate.app/Contents/plugins/java-decompiler/lib/java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -hdc=0 -dgs=1 -rsy=1 -lit=1 /path/to/foo.jar /path/to/outputdir/
出力先ディレクトリに元の jar ファイルと同名のファイルが出来ているので、それを解凍するとそこにソースファイルが含まれています。
jar xf /path/to/outputdir/foo.jar
以下の Stack Overflow を参考にしました。
How to decompile to java files intellij idea – Stack Overflow
InttelliJ のインストールディレクトリは環境によって異なるかもしれません。Community Edition か Ultimate Edition かでも違います。(私は JetBrains Toolbox 経由でインストールしているせいか、ホームディレクトリ配下にインストールされています。)
解説
どちらを使うべきか
FernFlower decompiler の方がエラーの少ないソースファイルが生成されるように思えるので、基本的には2つ目の方法の方が良いと思います。
ちなみに、今回紹介した2つ以外にもいくつか Java のデコンパイラーは存在するようです。今回の2つでデコンパイルした結果に満足できない場合は、他の選択肢を試してみる価値はあると思います。
FernFlower decompiler のコマンドラインオプションについて
以下のページ(README)を参照してください。
intellij-community/plugins/java-decompiler/engine at master · JetBrains/intellij-community
FernFlower decompiler のライセンスは Apache 2.0
先ほどの README に記載されていますが、FernFlower decompiler のライセンスは Apache Licence Version 2.0 です。
(仕事でソフトウェアを使う場合は、ラインセンスは気になりますよね。)
jar ファイルのライセンスに注意
IntelliJ IDEA でデコンパイル機能を使おうとすると最初に警告が出ますが、jar ファイルが商用ソフトの一部である場合は、ライセンスに注意してください。(オープンソースの場合はデコンパイルする意味が無いので、デコンパイルする必要があるのは、基本的にはクローズドソースのソフトだと思います。)
その他
なぜ必要だったか: 事情により開発会社からソースをもらえなかった
今回デコンパイルが必要だったのは、とあるお客様が所有権を保有する商用ソフトウェアで、そちらの新バージョンを弊社で開発する事になりました。旧バージョンの開発は別の開発会社様に外注していたのですが、事情によりその開発会社からソースを取得する事が出来なかったため、デコンパイルして仕様・アルゴリズムの確認を行いました。
実はこうした例は稀では無く、以前にも同じようなプロジェクトがありました。元の開発会社からソースをもらえなかったため、jar ファイルをデコンパイルした上で、バグ修正・機能追加などを行って新バージョンをリリースしました。
宣伝: 開発の引き継ぎ、レガシーシステムのリプレースなどは弊社にお任せください
ちょっと宣伝ですが、弊社では他の開発会社様からの開発の引き継ぎやレガシーシステムのリプレースなどを積極的に行っております。ソースコードや仕様書が無い場合も以下のお問い合わせフォームから一度ご相談ください。
直近では、以下の案件が他社様から開発(あるいは開発の一部)を引き継いだ事例です。
まとめ
色々な理由で、ソースコードが存在しないソフトウェアを改修したい場合があるかもしれません。Java の場合はデコンパイルが簡単にできるため、他のコンパイル型言語に比べると、ソースが無くても改修できる確率は高いと思います。
Java のデコンパイルの方法として今回は2つ紹介しましたが、基本的には IntteliJ IDEA 同梱の FernFlower decompiler を使うのが良いと思います。