# ADR-004 Use Java Packaging following Hexagonal Architecture Style
# Status
accepted
# Context
Die Struktur von Java-Packages ermöglicht eine schnelle Navigation im Quelltext und kann zur Qualität und Einheitlichkeit des Quelltextes beitragen. Es gibt verschiedene Stile, die Java Packages zu strukturieren - diese Entscheidung legt den Strukturstil fest.
# Decision
Durch die Verwendung der Hexagonal Architecture ADR003 ist der Architekturstil vorgegeben. Die Benennung der Java Packages folgt dem gewählten Architekturstil. Die Einhaltung dieser Benennung sollte mithilfe eines ArchUnit-Tests geprüft werden.
Hier ist ein Beispiel, wie die Package-Struktur aussehen kann:
└── <context-name>
├── adapter
│ ├── in
│ │ ├── rest
│ │ │ ├── dto
│ │ │ │ ├── ...Dto.java
│ │ │ │ └── ...Dto.java
│ │ │ ├── ...Controller.java (injects 1InPort)
│ │ │ ├── ...Controller.java (injects 2InPort)
│ │ │ ├── mapper
│ │ │ │ ├── ...Mapper.java
│ │ │ │ ├── ...Mapper.java (maps between domain model classes and DTOs)
│ │ │ ├── RestExceptionMapping.java
│ │ │ └── validation
│ │ │ ├── ....java
│ │ │ └── ...Validator.java
│ │ └── streaming
│ │ ├── ...Event.java
│ │ └── MessageProcessor.java (injects 3InPort)
│ └── out
│ ├── integration
│ │ └── IntegrationOutAdapter.java (implements IntegrationOutPort.java)
│ ├── storage
│ │ ├── BaseEntity.java
│ │ ├── ...Entity.java
│ │ ├── ...Repository.java
│ │ ├── ...Mapper.java (maps between domain model classes and entities)
│ │ ├── StorageOutAdapter.java (implements StorageOutPort.java)
│ └── ...
│ └── ....java
├── application
│ ├── ...1UseCase.java (implements ...1InPort.java)
│ ├── ...2UseCase.java (implements ...2InPort.java)
│ ├── ...3UseCase.java (implements ...3InPort.java)
│ └── port
│ ├── in
│ │ ├── ...Exception.java
│ │ ├── ...1InPort.java (uses domain model classes)
│ │ ├── ...2InPort.java (uses domain model classes)
│ │ └── ...3InPort.java (uses domain model classes)
│ └── out
│ ├── StorageOutPort.java (uses domain model classes)
│ └── IntegrationOutPort.java (uses domain model classes)
├── domain
│ └── model
│ ├── ....java
│ └── ....java
└── infrastructure
├── dialect
│ └── NoToastPostgresSQLDialect.java
└── mapper
└── MapstructConfiguration.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53