ArchUnit

ArchUnit is a free, simple, and extensible Java architecture test library. It verifies architectural rules by analysing compiled bytecode — no source code access needed.

Specs Using ArchUnit

Spec Description Priority
ARCH-001 Layering: Controller → Service → Repository critical
ARCH-002 Dependency Inversion at Service Boundary major
ARCH-003 Package Structure by Feature major

Quick Start

Maven

<dependency>
    <groupId>com.tngtech.archunit</groupId>
    <artifactId>archunit-junit5</artifactId>
    <version>1.5.0</version>
    <scope>test</scope>
</dependency>

Basic Test

@AnalyzeClasses(packages = "com.example.myapp")
public class ArchitectureTest {

    @ArchTest
    static final ArchRule layered_architecture = layeredArchitecture()
        .consideringAllDependencies()
        .layer("Controller").definedBy("..controller..")
        .layer("Service").definedBy("..service..")
        .layer("Repository").definedBy("..repository..")
        .whereLayer("Controller").mayNotBeAccessedByAnyLayer()
        .whereLayer("Service").mayOnlyBeAccessedByLayers("Controller")
        .whereLayer("Repository").mayOnlyBeAccessedByLayers("Service");
}

Guides

Guide Description
Adoption Playbook Step-by-step guide to adopt ArchUnit in any Java project
Maven Surefire Integration Deep dive into Surefire + ArchUnit integration
Shared Module Building a shared ArchUnit rules library for microservices
Java Checks Research Research report on all ArchUnit check categories

Key Concepts

Concept Description
@AnalyzeClasses Declares which packages to import and analyse
@ArchTest Marks a field or method as an architecture test
ArchRule A fluent rule definition (e.g. noClasses()...should()...)
FreezingArchRule Freezes existing violations, only fails on new ones
ArchTests Groups rules from another class for reuse

Trigger Policy

ArchUnit tests run as standard JUnit tests — they execute with mvn test on every push. No separate CI step needed.