1

違法な依存関係とサイクルを見つけるために、JDepend 2.9.1 に基づく JUnit テストがあります。

本日、JDepend に依存関係がないことがわかりました。次のコードでは、B に依存する A を考慮していないようです。

public class A {
    @SomeAnotation(value = B.class)
    public String someMethod() {
        ...
    }
}

テストは次のようになります。

private JDepend setupJDepend() {
    JDepend jdepend = null;
    try {
        jdepend = new JDepend();
        jdepend.addDirectory("target/classes");
        jdepend.addDirectory("target/test-classes");
    } catch (final IOException ioException) {
        fail("An IOException occured: " + ioException.getMessage());
    }
    jdepend.analyzeInnerClasses(true);
    return jdepend;
}

@Test
public final void testNoCyclesOnPackageLevel() {
    final JDepend jdepend = setupJDepend();
    final Collection<?> packages = analyzeDependencies();

    assertTrue(packages.size() > 0);

    assertFalse("The code contains dependency cycles on package level!",
            jdepend.containsCycles());

    if (ignorePackageCycle) {
        return;
    }

    java.util.List<String> packagesWithCycle = new ArrayList<String>();
    for (Object pObject : packages) {
        JavaPackage javaPackage = (JavaPackage) pObject;
        if (javaPackage.containsCycle()) {
            packagesWithCycle.add(javaPackage.getName());
        }
    }
    assertTrue(packagesWithCycle.toString(), packagesWithCycle.isEmpty());
}

JDepend4Eclipse プラグインは依存関係を確認し、結果のサイクルを報告します。

これはバグですか?回避策はありますか? 私たちは何か間違ったことをしていますか?

関連するメモ: jdepend.containsCycles() は常に false を返します。

4

1 に答える 1

2

これは欠けている機能です!

@Retention(SOURCE)宣言された場合、コンパイルされたクラスファイルで@SomeAnotationツールを見つけることができません。B

他のポリシーの場合、アノテーションはクラスファイルに含まれていますが、ClassFileParserJDependのはいかなる種類のアノテーションもサポートしていません。これは、これまでのところ欠落している機能です。

編集:チェックインされたソースコードは、Java 5アノテーションをサポートし、Eclipseプラグインで使用されます。たぶん2.9.1はこれに基づいていません。JDependのリリースノートとそのリリース日が見つかりません。コードは2010-05-19にチェックされています。「最新の」リリースは2008年からのようです。

于 2011-08-30T14:08:51.703 に答える