読者です 読者をやめる 読者になる 読者になる

「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/

[ 環境情報 ]
Windows 7 SP1
Java SE 8 Update 45
JDepend 2.9.1