「JDepend」 パッケージ間の循環依存を調べる
Java のパッケージ間で循環依存が発生しているか調べるツールを探していたところ JDepend というツールが確認できました。ちょっと使い方だけメモしておきます。
・JDepend
http://clarkware.com/software/JDepend.html
※ JDepend は循環依存だけじゃなくて、パッケージ間のメトリクスを測定するツールみたいです。
1. ダウンロードする
何はともあれダウンロード。以下から。
・JDepend
http://clarkware.com/software/JDepend.html#download
jdepend-2.9.1.zip を適当なディレクトリに展開しておく ( 以下 JDEPEND_HOME )。
2. クラスパスを通す
ドキュメントに書いてますが「set CLASSPATH=%CLASSPATH%;%JDEPEND_HOME%\lib\jdepend-2.9.1.jar」でクラスパスを通しておく。
・JDepend
http://clarkware.com/software/JDepend.html#installation
一応ちゃんと通ってるか確認しておく。以下みたいな出力得られれば OK。インストール完了。
java jdepend.textui.JDepend Must specify at least one directory. usage: JDepend [-components <components>] [-file <output file>] <directory> [directory2 [directory 3] ...]
3. .jar ファイルのメトリクスを測定してみる
以下のようなクラスで試してみました。
■ A.java
package aaa; import bbb.B; public class A { public B b; public A() { b = new B(); } }
■ B.java
package bbb; import aaa.A; public class B { public A a; public B() { a = new A(); } }
上記から .jar ファイルを作成して、適当なディレクトリに置く ( C:\jdepend )。
JDepend を実行する。
java jdepend.textui.JDepend C:\jdepend
なんかいろいろな情報が出力されますが、循環依存は「Package Dependency Cycles」を確認すればよさそう。
-------------------------------------------------- - Package Dependency Cycles: -------------------------------------------------- aaa | | bbb |-> aaa bbb | | aaa |-> bbb
ちなみに、B.java を以下のようにすると「Package Dependency Cycles」には何も出力されない。
package bbb; public class B { }
GUI が用意されてたり、XML での出力に対応してたり ( ドキュメントに書いてますが循環依存調べるときは上記の textual か XMLがいいみたい。今回みたいな単純な .jar であれば GUI でもいいと思うけどでっかいライブラリとかだととても確認できそうにない感じでした・・・ ) するみたいですね。また、JUnit のテストケースとして調べることもできるみたいです。
ひとまず、今回は使い方だけということで、以上です。
※ 以下も参考にさせていただきました。
・パッケージ間の循環依存を自動で検出する | GuildWorks Blog
http://blog.guildworks.jp/2014/09/25/find-cyclic-dependencies/