Кто-то дёрнул репозиторий прямо из контроллера «по-быстрому», ревьюер не заметил — и слои потекли. Документация в Confluence про это не в курсе.
ArchUnit превращает архитектурные правила в обычные unit-тесты. Он читает байткод твоих классов и проверяет зависимости, а значит, нарушение падает прямо в CI, как любой другой красный тест:
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.lang.ArchRule;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
@Test
void controllers_must_not_touch_repositories() {
var imported = new ClassFileImporter().importPackages("com.myapp");
ArchRule rule = classes()
.that().resideInAPackage("..controller..")
.should().onlyDependOnClassesThat()
.resideOutsideOfPackage("..repository..");
rule.check(imported);
}
🔹 Из коробки:
→ проверка слоёв (layered) и onion-архитектуры одним fluent-вызовом;
→ поиск циклических зависимостей между пакетами;
→ контроль неймингов и аннотаций.
Работает с любым тест-фреймворком — JUnit, TestNG, без разницы. Для легаси есть «заморозка»: фиксируешь текущие нарушения как baseline и блокируешь только новые, разгребая старые постепенно. Можно даже задавать правила PlantUML-диаграммой и проверять код на соответствие картинке.
Версия 1.4.2, поддержка вплоть до Java 26. Идеален, когда в команде больше трёх человек и архитектуру хочется не объяснять на словах, а зафиксировать в коде.
📱 Репозиторий
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise