JDepend пропускает циклы
У нас есть тест JUnit, основанный на JDepend 2.9.1, чтобы найти недопустимые зависимости и циклы.
Сегодня мы обнаружили, что в JDepend отсутствуют зависимости. Кажется, он не учитывает A в зависимости от B в следующем фрагменте кода:
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.
1 ответ
Это недостающая особенность!
Для @Retention(SOURCE)
объявленный @SomeAnotation
ни один инструмент не может найти B
в скомпилированном файле класса.
Для других политик аннотации включены в файл класса, но ClassFileParser
JDepend не поддерживает аннотации любого вида, пока это отсутствует функция.
РЕДАКТИРОВАТЬ: исходный код зарегистрирован, поддерживает аннотации Java 5 и используется в плагине eclipse. Может быть, 2.9.1 не основан на этом. Не найдены заметки о выпуске JDepend и дата его выпуска. Кодекс был проверен в 2010-05-19. "Последний" релиз, кажется, с 2008 года.