Einleitung: Was ist ein Monorepository und warum braucht ein Java-Entwickler es?
Stellen Sie sich vor, Sie schreiben eine große Java-Anwendung: einen Webdienst, eine Bibliothek für die Datenbankarbeit und ein separates Modul für die Protokollierung. Traditionell wird jede Komponente in einem eigenen Git-Repository gespeichert. Es gibt jedoch einen anderen Ansatz — das Monorepository (Monorepo). Dies ist eine Strategie, bei der der gesamte Code eines Projekts (oder sogar mehrerer verwandter Projekte) in einem einzigen Repository gespeichert wird.
Für Java-Anfänger mag ein Monorepository ungewöhnlich erscheinen, bietet aber wichtige Vorteile:
- Einheitliche Abhängigkeitsversionen — alle Module verwenden dieselben Bibliotheksversionen, was Konflikte ausschließt.
- Vereinfachtes Refactoring — eine API-Änderung in einem Modul ist sofort in allen abhängigen Modulen sichtbar.
- Gemeinsame Einstellungen — eine Konfigurationsdatei für Linter, Formatierung und CI/CD.
- Leichter Start — keine Notwendigkeit, mehrere Repositories für ein kleines Projekt einzurichten.
In diesem Artikel werden wir besprechen, wie man ein Monorepository in Java mit den beliebten Build-Tools Maven und Gradle organisiert. Sie erfahren, wie Sie Ordner strukturieren, einen Multi-Modul-Build konfigurieren und typische Fehler vermeiden.
Hauptteil
1. Monorepository-Struktur: Vom Einfachen zum Komplexen
Die richtige Ordnerstruktur ist die Grundlage eines erfolgreichen Monorepositorys. Hier ist eine empfohlene Vorlage für ein Java-Projekt:
my-monorepo/├── build.gradle # Root-Build-Datei (für Gradle)├── settings.gradle # Liste der Module├── pom.xml # Root-POM (für Maven)├── README.md├── .gitignore├── libs/ # Gemeinsame Bibliotheken│ ├── common-utils/│ └── logging-framework/├── services/ # Microservices oder Anwendungen│ ├── user-service/│ └── payment-service/└── tools/ # Dienstprogramme und Skripte └── code-generator/Jedes Modul ist ein eigenständiges Java-Projekt mit seiner eigenen pom.xml oder build.gradle. Die Root-Konfigurationsdateien verwalten Abhängigkeiten und Versionen. Betrachten wir beide Optionen genauer.
2. Monorepository mit Maven: Multi-Modul-Projekt
Maven unterstützt Multi-Modul-Projekte von Haus aus. Erstellen Sie eine Root-pom.xml mit Angabe der Module:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>my-monorepo</artifactId> <packaging>pom</packaging> <version>1.0.0</version> <modules> <module>libs/common-utils</module> <module>services/user-service</module> <module>services/payment-service</module> </modules>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.2.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement></project>Im Modul common-utils (Ordner libs/common-utils) erstellen wir unsere eigene pom.xml, die auf das übergeordnete Projekt verweist:
<project> <parent> <groupId>com.example</groupId> <artifactId>my-monorepo</artifactId> <version>1.0.0</version> </parent> <artifactId>common-utils</artifactId> <dependencies> <dependency>