जावा के साथ मोनोरिपॉजिटरी: व्यवहार में कोड संगठन
\nआधुनिक जावा-डेवलपमेंट में, मोनोरिपॉजिटरी (monorepo) और कई अलग-अलग रिपॉजिटरी के बीच चुनाव का सवाल तेजी से उठता है। मोनोरिपॉजिटरी एक दृष्टिकोण है जिसमें पूरे प्रोजेक्ट का कोड (कई सेवाएं, लाइब्रेरीज़, कॉन्फ़िगरेशन) एक ही Git-रिपॉजिटरी में संग्रहीत किया जाता है। इस लेख में, हम विश्लेषण करेंगे कि व्यवहार में जावा के साथ मोनोरिपॉजिटरी कैसे व्यवस्थित करें: फ़ोल्डर संरचना से लेकर बिल्ड और CI/CD सेटअप तक। आपको तैयार कोड उदाहरण और सिफारिशें मिलेंगी जो सामान्य गलतियों से बचने में मदद करेंगी।
\n\nजावा के लिए मोनोरिपॉजिटरी क्यों?
\nमोनोरिपॉजिटरी विशेष रूप से जावा प्रोजेक्ट्स के लिए उपयोगी है जहां कई मॉड्यूल एक-दूसरे पर निर्भर होते हैं। मुख्य लाभ:
\n- \n
- निर्भरताओं का एकीकृत संस्करण — सभी मॉड्यूल लाइब्रेरीज़ के एक ही संस्करण का उपयोग करते हैं, जो विरोध को समाप्त करता है। \n
- सरलीकृत रीफैक्टरिंग — एक मॉड्यूल में API परिवर्तन तुरंत सभी आश्रितों में दिखाई देता है। \n
- सामान्य बिल्ड कॉन्फ़िगरेशन — Gradle या Maven सभी मॉड्यूल के लिए एक बार कॉन्फ़िगर किए जाते हैं। \n
- CI/CD की अखंडता — सभी सेवाओं के लिए एक पाइपलाइन, परिवर्तनों को ट्रैक करना आसान है। \n
हालांकि, मोनोरिपॉजिटरी अनुशासन की मांग करता है: स्पष्ट संरचना के बिना, यह अराजकता में बदल जाता है। आइए उचित संगठन पर विचार करें।
\n\nजावा प्रोजेक्ट के लिए मोनोरिपॉजिटरी संरचना
\nजावा के साथ मोनोरिपॉजिटरी के लिए अनुशंसित संरचना (Gradle के उदाहरण पर):
\nmy-monorepo/\n├── build.gradle.kts # रूट बिल्ड फ़ाइल\n├── settings.gradle.kts # सभी मॉड्यूल शामिल करता है\n├── gradle.properties # सामान्य गुण\n├── libs/ # सामान्य लाइब्रेरीज़\n│ ├── common-utils/\n│ │ ├── build.gradle.kts\n│ │ └── src/\n│ └── logging/\n│ ├── build.gradle.kts\n│ └── src/\n├── services/ # माइक्रोसर्विसेज़\n│ ├── user-service/\n│ │ ├── build.gradle.kts\n│ │ └── src/\n│ └── payment-service/\n│ ├── build.gradle.kts\n│ └── src/\n├── config/ # कॉन्फ़िगरेशन (जैसे, checkstyle, spotbugs)\n│ └── checkstyle.xml\n└── docker/ # प्रत्येक सेवा के लिए Dockerfile\n ├── user-service.Dockerfile\n └── payment-service.Dockerfile\n\nमुख्य सिद्धांत:
\n- \n
- मॉड्यूल को
libs(लाइब्रेरीज़) औरservices(निष्पादन योग्य एप्लिकेशन) में विभाजित किया गया है। \n - रूट
build.gradle.ktsसामान्य प्लगइन्स और संस्करण निर्धारित करता है। \n - फ़ाइल
settings.gradle.ktsसभी उप-प्रोजेक्ट शामिल करती है। \n
settings.gradle.kts का उदाहरण:
rootProject.name = "my-monorepo"\n\ninclude(\n "libs:common-utils",\n "libs:logging",\n "services:user-service",\n "services:payment-service"\n)\n\n\nमॉड्यूल के बीच निर्भरताएँ सेट करना
\nमोनोरिपॉजिटरी का मुख्य कार्य आंतरिक निर्भरताओं का प्रबंधन करना है। एक उदाहरण पर विचार करें जहां user-service common-utils पर निर्भर है।
चरण 1. रूट gradle.properties में संस्करण घोषित करें:
# gradle.properties\nkotlinVersion=1.9.0\nspringBootVersion=3.2.0\ncommonUtilsVersion=1.0.0\n\nचरण 2. रूट build.gradle.kts में प्लगइन्स कनेक्ट करें और सामान्य सेटिंग्स निर्धारित करें:
plugins {\n id("java-library") apply false\n id("org.springframework.boot") version "3.2.0" apply false\n id("io.spring.dependency-management") version "1.1.4" apply false\n}\n\nallprojects {\n group = "com.example"\n version = "1.0.0"\n\n repositories {\n mavenCentral()\n }\n}\n\nsubprojects {\n apply(plugin = "java-library")\n\n java {\n sourceCompatibility = JavaVersion.VERSION_17\n targetCompatibility = JavaVersion.VERSION_17\n }\n\n dependencies {\n implementation("org.slf4j:slf4j-api:2.0.9")\n testImplementation("org.j