مقدمة: ما هو المستودع الواحد ولماذا يحتاجه مطور Java؟
تخيل أنك تكتب تطبيق Java كبير: خدمة ويب، مكتبة للعمل مع قواعد البيانات، ووحدة منفصلة للتسجيل. تقليديًا، يتم تخزين كل مكون في مستودع Git الخاص به. ولكن هناك نهج آخر — المستودع الواحد (monorepo). إنها استراتيجية يتم فيها تخزين كل كود المشروع (أو حتى عدة مشاريع مرتبطة) في مستودع واحد.
بالنسبة لمطوري Java المبتدئين، قد يبدو المستودع الواحد غير مألوف، لكنه يوفر مزايا مهمة:
- إصدار موحد للتبعيات — تستخدم جميع الوحدات نفس إصدارات المكتبات، مما يلغي التعارضات.
- إعادة هيكلة مبسطة — تغيير API في وحدة واحدة يظهر فورًا في جميع الوحدات التابعة.
- إعدادات مشتركة — ملف تكوين واحد للمُدقق، التنسيق، و CI/CD.
- بداية سهلة — لا حاجة لإعداد عدة مستودعات لمشروع صغير.
في هذه المقالة، سنشرح كيفية تنظيم مستودع واحد في Java باستخدام أدوات البناء الشائعة: Maven و Gradle. ستتعلم كيفية هيكلة المجلدات، إعداد البناء متعدد الوحدات، وتجنب الأخطاء النموذجية.
الجزء الرئيسي
1. هيكل المستودع الواحد: من البسيط إلى المعقد
الهيكل الصحيح للمجلدات هو أساس المستودع الواحد الناجح. إليك النموذج الموصى به لمشروع Java:
my-monorepo/├── build.gradle # ملف البناء الجذر (لـ Gradle)├── settings.gradle # قائمة الوحدات├── pom.xml # POM الجذر (لـ Maven)├── README.md├── .gitignore├── libs/ # المكتبات المشتركة│ ├── common-utils/│ └── logging-framework/├── services/ # الخدمات المصغرة أو التطبيقات│ ├── user-service/│ └── payment-service/└── tools/ # الأدوات والنصوص البرمجية └── code-generator/كل وحدة هي مشروع Java مستقل مع ملف pom.xml أو build.gradle الخاص بها. تدير ملفات التكوين الجذرية التبعيات والإصدارات. دعنا نستعرض كلا الخيارين بالتفصيل.
2. المستودع الواحد مع Maven: مشروع متعدد الوحدات
يدعم Maven المشاريع متعددة الوحدات بشكل مدمج. أنشئ ملف pom.xml جذريًا مع تحديد الوحدات:
<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>في وحدة common-utils (المجلد libs/common-utils)، ننشئ ملف pom.xml خاصًا بها يشير إلى المشروع الأصلي:
<project> <parent> <groupId>com.example</groupId> <artifactId>my-monorepo</artifactId> <version>1.0.0</version> </parent> <artifactId>common-utils</artifactId> <dependencies> <dependency>