jar ファイルをまとめてデコンパイルする方法 x 2

jar ファイルをまとめてデコンパイルする方法 x 2

やり方

タイトル通りですが、jar ファイルをまとめてデコンパイルする方法を2通り説明します。

JD GUI を使う

JD (Java Decompiler) の GUI 版である JD GUI を使います。

まずは以下のページからダウンロードします。

Java Decompiler

あとは以下の手順で OK です。

  1. File -> Open File で、デコンパイルしたい jar ファイルを選びます
  2. 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 を使うのが良いと思います。

we are hiring

優秀な技術者と一緒に、好きな場所で働きませんか

株式会社もばらぶでは、優秀で意欲に溢れる方を常に求めています。働く場所は自由、働く時間も柔軟に選択可能です。

現在、以下の職種を募集中です。ご興味のある方は、リンク先をご参照下さい。

コメントを残す