depDetectGui

2019年5月21日

English page is here

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によって簡単に表示できるようにしてある。

  1. .classファイルフォルダを指定すると、jdepsを呼び出し、全ての.classの依存を調査する。
  2. 循環参照しているパッケージを一覧するので、その一つを選択する。
  3. 2.で選択されたパッケージと循環依存するパッケージ一覧を表示する。その一つを選択する。
  4. 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といったおなじみのライブラリ以外に必要なものはすべてオープンソースとなっている。

以下は、ビルドに必要なオープンソースライブラリである。

以上のコードすべてはMITライセンスである。

Copyright (c) 2018 Cryptomedia Co.,Ltd.
Released under the MIT license
https://opensource.org/licenses/mit-license.php

Posted by ysugimura