depDetectGui
depDetectGuiは、Javaの.classファイル・フォルダにおいて、Javaパッケージ間の循環依存を検出する。内部ではjdepsを使用して各.classでの外部依存を取得する。本ソフトはオープンソースソフトである。
本ソフトは実際に、10年以上前に記述された40万行以上、400個程度のパッケージ数のJavaプログラムの解析に使用している。今後も改良をする予定である。
実行形式jarダウンロード
このソフトはオープンソースであり、ソースのありかは一番最後にあるが、ビルドが面倒な場合のために実行形式jarファイルを用意してある。単純にダブルクリックすれば、実行できるはずである(Java8以上必須)。
以下からdepDetectGui-*.*.*.jarをダウンロードしてほしい。
https://ysugimura.github.io/dist/
概要:Javaパッケージ間の循環依存を検出する
depDetectGuiは、.classフォルダツリーにおけるJavaパッケージ間の循環依存を検出する。例えば、以下のようなSample1,Sample2というクラスがあり、互いに参照している場合に、これを循環参照として検出する。
foo
+- bar1
| +- Sample1
+- bar2
+- Sample2
その他に、あるパッケージからどのパッケージに依存しているか、逆にどのパッケージから依存されているかを表示する。
仕組み:JDK付属のjdepsで依存解析
基本的な仕組みとしては単純でJDK付属のjdepsという依存解析ツールを呼び出し、その標準出力を取得してパッケージ間の依存関係解析をするだけである。これをGUIによって簡単に表示できるようにしてある。
- .classファイルフォルダを指定すると、jdepsを呼び出し、全ての.classの依存を調査する。
- 循環参照しているパッケージを一覧するので、その一つを選択する。
- 2.で選択されたパッケージと循環依存するパッケージ一覧を表示する。その一つを選択する。
- 2.3.で選択されたパッケージ内のクラスの循環依存に資するクラスを表示する。
といった具合である。
jdepsの指定
実行には、JDKに含まれるjdepsが必要である。これに実行パスが通っていることを前提にしているが、通っていない場合には指定することもできる。メニューからjdepsを選択する。
「設定」でjdepsのフルパスを指定する。指定された場合には、プロセス実行においてこのパスが指定されるが、指定されていない場合には「jdeps」のみが指定される。
プロジェクトの定義と選択
depDetectGuiでは複数のプロジェクト(複数のJavaプロジェクトにあたる)を覚えておくことができる。そのうちの一つを選択することにより、一つのプロジェクトの.classファイルにおける循環依存を検出する。
まずは、メニューからListを選択する。
以下のようなプロジェクト一覧が表示される。このうちの一つを選択して、OKすれば解析対象となる。
プロジェクトを作成する場合は、上の画面で「新規」を選択し、以下のようにプロジェクト名と.classのフォルダパスを指定する。フォルダは複数指定することが可能。
プロジェクトの更新
プロジェクトの.classファイルが変更された場合は、単純にメニューからUpdateを選択すればよい。
枝刈りモード
大規模なプロジェクト、例えば数十万行のソースコードで数百ものパッケージがある場合、まずは大きな単位で循環参照を解消していくことが望まれる。しかし、デフォルトでは、その数百のパッケージの一つ一つについて循環参照を検出して表示することになる。
このような場合には「枝刈りモード」を使用した方がよい。これは以下のように説明できる。
今以下のようなパッケージがあるとする。もちろん実際にはもっと大量のパッケージがあるわけだ。
- a
- a.b
- a.b.c
- a.b.d
- a.e
- a.e.f
- a.e.g
これらの大量のパッケージの循環参照を、端から取り上げていくのではなく、枝刈りをしておおまかに把握する。この場合には、図のようにa.b, a.eで枝刈りをする。すると、以下のパッケージになる。
- a
- a.b
- a.e
この場合、刈られたパッケージの依存関係は上位のパッケージに含まれるようになる。つまり、
- a.b.c, a.b.dの依存は、a.bに含まれる
- a.e.f, a.e.fの依存は、a.eに含まれる
ようになる。これを行うには、単純に「全パッケージ」リストにおいて「刈」列をチェックする。
すると、それ以下のパッケージが表示から消え、それらのパッケージの依存が「刈」チェックされたパッケージに含まれるようになる。
そして、「同じパッケージ内ではパッケージ間の循環参照は存在しない」のだから、この例の場合にはすべての循環参照が消える。
依存先・依存元の表示
その他の機能として、各パッケージの依存先と依存元の表示がある。
- 依存先パッケージと依存ソースクラス
対象パッケージが依存するパッケージと、対象パッケージのどのクラスが依存しているかを表示する。 - 依存元パッケージと依存ソースクラス
対象パッケージに依存するパッケージと、その依存パッケージ内のどのクラスが依存しているかを表示する。
ややこしいのだが、これを説明するのが以下の画面になる。
外部参照の表示
これは単純に、指定された.classに含まれていなかったパッケージがリストアップされる。Javaの実行ライブラリや、その他のライブラリになる。
書き込みファイル
書き込むファイルとしては、各種設定値をセーブするためにH2データベースを作成している。Windowsの場合であれば、以下の場所になる。
c:\users\ユーザ名\.depDetect\settings.mv.db
c:\users\ユーザ名\.depDetect\settings.trace.db
ソースコード
このツールはオープンソースである。JavaのRuntimeやGuice、JUnit、H2といったおなじみのライブラリ以外に必要なものはすべてオープンソースとなっている。
以下は、ビルドに必要なオープンソースライブラリである。
- https://gitlab.com/ysugimura/eventBus
- https://github.com/ysugimura/gsonwrapper
- https://github.com/ysugimura/miniSerial
- https://github.com/ysugimura/fxwrapper
- https://github.com/ysugimura/depDetect
以上のコードすべてはMITライセンスである。
Copyright (c) 2018 Cryptomedia Co.,Ltd.
Released under the MIT license
https://opensource.org/licenses/mit-license.php