مستودع واحد مع Java: كيفية تنظيم كود مشروع كبير
في تطوير مشاريع Java الحديثة، غالبًا ما يطرح السؤال: هل نخزن جميع المكونات في مستودع واحد (مستودع واحد) أم نقسمها إلى عدة مستودعات منفصلة (مستودعات متعددة)؟ المستودع الواحد (monorepo) هو نهج يتم فيه تخزين كود عدة مشاريع ومكتبات وخدمات في نظام واحد للتحكم في الإصدارات. في هذه المقالة، سنشرح كيفية تنظيم كود Java بشكل فعال في مستودع واحد باستخدام Maven وGradle، وسنستعرض أمثلة عملية.
مزايا وعيوب المستودع الواحد لـ Java
قبل الانتقال إلى التنفيذ، من المهم فهم متى يكون المستودع الواحد مبررًا. بالنسبة لمشاريع Java، يكون مفيدًا بشكل خاص إذا كان لديك مكتبات مشتركة أو نماذج بيانات أو واجهات تستخدمها عدة خدمات.
مزايا المستودع الواحد
- إصدار موحد للتبعيات: جميع الوحدات تستخدم نفس إصدارات المكتبات، مما يلغي التعارضات.
- إعادة هيكلة بسيطة: تغيير API المشترك أو نموذج البيانات يحدث بشكل ذري في commit واحد.
- CI/CD مبسط: خط أنابيب واحد لبناء واختبار جميع الوحدات.
- الشفافية: كل مطور يرى كود المشروع بأكمله، مما يسهل فهم البنية.
العيوب وكيفية التخفيف منها
- حجم المستودع: قد يصبح ضخمًا بمرور الوقت. الحل: استخدام
.gitignoreوعدم تخزين القطع الأثرية الثنائية. - تعقيد إعداد CI: يجب أن يكون قادرًا على تشغيل الوحدات المعدلة فقط. أدوات مثل Bazel أو Gradle Build Cache تساعد.
- مراجعة الكود الطويلة: إذا كانت جميع التغييرات تمر عبر طلب سحب واحد. الحل: استخدام سياسات الفروع والمشغلات التلقائية.
هيكل المستودع الواحد مع Java: مثال عملي
لننظر إلى هيكل نموذجي لمستودع واحد لـ Java باستخدام Maven. لنفترض أن لدينا ثلاث وحدات: core (المنطق المشترك)، service-api (REST API)، و service-worker (معالج الخلفية).
my-java-monorepo/├── pom.xml # POM الرئيسي├── core/│ ├── pom.xml│ └── src/│ └── main/java/com/example/core/│ └── Utils.java├── service-api/│ ├── pom.xml│ └── src/│ └── main/java/com/example/api/│ └── MainController.java├── service-worker/│ ├── pom.xml│ └── src/│ └── main/java/com/example/worker/│ └── WorkerTask.java└── .gitignorePOM الرئيسي (pom.xml)
في جذر المشروع، يتم إنشاء POM رئيسي يدير الإصدارات ويسرد الوحدات:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>my-java-monorepo</artifactId> <version>1.0.0</version> <packaging>pom</packaging>
<modules> <module>core</module> <module>service-api</module> <module>service-worker</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>