javaeclipsemavenarchitecturedependencies

Enforcing layered architecture in Java


Given a software system written in Java consisting of three layers, A -> B -> C, i.e. layer A uses layer B and B uses layer C.

I want to make sure that a class of one layer only has access only to classes of the same layer or its direct dependency, i.e. B should be able to access C but not A. Also A should be able to access B but not C.

Is there an easy way to enforce such a restriction? Ideally I want eclipse to complain at once if one tries to access a class of the wrong layer.

The software currently uses maven. Therefore I tried to put A, B, and C into different maven modules and to declare dependencies properly. This works fine to prevent B to access A, but does not prevent A to access C.

Next I tried to exclude C from the dependency to B. This now also prevents access from A to C. However now I am no longer able to use copy-dependencies to collect all transitive dependencies needed for run time.

Is there a good way that allows me a clean separation of layers, but also allows me to collect all needed runtime dependencies?


Solution

  • Maybe you can try this in the pom of A:

    <dependency>
        <groupId>the.groupId</groupId>
        <artifactId>moduleB</artifactId>
        <version>1.0</version>
        <exclusions>
            <exclusion>
                <groupId>the.groupId</groupId>
                <artifactId>moduleC</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>the.groupId</groupId>
        <artifactId>moduleC</artifactId>
        <version>1.0</version>
        <scope>runtime</scope>
    </dependency>
    

    Can this help you?