इस पेज पर, Maven से Bazel पर माइग्रेट करने का तरीका बताया गया है. इसमें, ज़रूरी शर्तें और इंस्टॉल करने के तरीके के बारे में भी बताया गया है. इसमें Maven और Bazel के बीच के अंतर के बारे में बताया गया है. साथ ही, Guava प्रोजेक्ट का इस्तेमाल करके माइग्रेशन का उदाहरण दिया गया है.
किसी भी बिल्ड टूल से Bazel पर माइग्रेट करते समय, दोनों बिल्ड टूल को एक साथ चलाना सबसे अच्छा होता है. ऐसा तब तक करें, जब तक कि आपकी डेवलपमेंट टीम, सीआई सिस्टम, और अन्य काम के सिस्टम को पूरी तरह से माइग्रेट नहीं कर दिया जाता. एक ही रिपॉज़िटरी में Maven और Bazel को चलाया जा सकता है.
शुरू करने से पहले
- अगर Bazel इंस्टॉल नहीं है, तो उसे इंस्टॉल करें.
- अगर आपने पहले कभी Bazel का इस्तेमाल नहीं किया है, तो माइग्रेट करने से पहले Bazel के बारे में जानकारी: Java को बिल्ड करना ट्यूटोरियल पढ़ें. इस ट्यूटोरियल में, Bazel के कॉन्सेप्ट, स्ट्रक्चर, और लेबल के सिंटैक्स के बारे में बताया गया है.
Maven और Bazel के बीच अंतर
- Maven, टॉप-लेवल
pom.xml
फ़ाइल का इस्तेमाल करता है. Bazel, एक से ज़्यादा बिल्ड फ़ाइलों और हरBUILD
फ़ाइल के लिए कई टारगेट के साथ काम करता है. इससे, Maven की तुलना में ज़्यादा इंक्रीमेंटल बिल्ड बनाने में मदद मिलती है. - Maven, डिप्लॉयमेंट प्रोसेस के चरणों को मैनेज करता है. Bazel, डिप्लॉयमेंट को ऑटोमेट नहीं करता.
- Bazel की मदद से, भाषाओं के बीच डिपेंडेंसी को दिखाया जा सकता है.
- प्रोजेक्ट में नए सेक्शन जोड़ने पर, हो सकता है कि आपको Bazel के साथ नई
BUILD
फ़ाइलें जोड़नी पड़ें. सबसे सही तरीका यह है कि हर नए Java पैकेज मेंBUILD
फ़ाइल जोड़ें.
Maven से Bazel पर माइग्रेट करना
अपने प्रोजेक्ट को Bazel पर माइग्रेट करने का तरीका यहां बताया गया है:
- WORKSPACE फ़ाइल बनाना
- एक BUILD फ़ाइल बनाना
- ज़्यादा BUILD फ़ाइलें बनाना
- Bazel का इस्तेमाल करके बिल्ड करना
यहां दिए गए उदाहरण, Guava प्रोजेक्ट को Maven से Bazel में माइग्रेट करने से जुड़े हैं.
इस्तेमाल किए गए Guava प्रोजेक्ट का रिलीज़ वर्शन v31.1
है. Guava का इस्तेमाल करने वाले उदाहरणों में, माइग्रेशन के हर चरण के बारे में नहीं बताया गया है. हालांकि, इनमें उन फ़ाइलों और कॉन्टेंट को दिखाया गया है जिन्हें माइग्रेशन के लिए जनरेट किया गया है या मैन्युअल तरीके से जोड़ा गया है.
$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1
1. WORKSPACE फ़ाइल बनाना
अपने प्रोजेक्ट के रूट में WORKSPACE
नाम की फ़ाइल बनाएं. अगर आपके प्रोजेक्ट में कोई बाहरी डिपेंडेंसी नहीं है, तो फ़ाइल फ़ोल्डर खाली हो सकता है.
अगर आपका प्रोजेक्ट ऐसी फ़ाइलों या पैकेज पर निर्भर करता है जो प्रोजेक्ट की किसी डायरेक्ट्री में मौजूद नहीं हैं, तो Workspace फ़ाइल में इन बाहरी डिपेंडेंसी के बारे में बताएं. Workspace फ़ाइल के लिए, बाहरी डिपेंडेंसी की सूची को ऑटोमेट करने के लिए,
rules_jvm_external
का इस्तेमाल करें. इस नियमों के सेट का इस्तेमाल करने के बारे में निर्देशों के लिए, README देखें.
Guava प्रोजेक्ट का उदाहरण: बाहरी डिपेंडेंसी
rules_jvm_external
नियमों के सेट की मदद से, Guava प्रोजेक्ट की बाहरी डिपेंडेंसी की सूची बनाई जा सकती है.
WORKSPACE
फ़ाइल में यह स्निपेट जोड़ें:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
RULES_JVM_EXTERNAL_TAG = "4.3"
RULES_JVM_EXTERNAL_SHA = "6274687f6fc5783b589f56a2f1ed60de3ce1f99bc4e8f9edef3de43bdf7c6e74"
http_archive(
name = "rules_jvm_external",
sha256 = RULES_JVM_EXTERNAL_SHA,
strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)
load("@rules_jvm_external//:defs.bzl", "maven_install")
maven_install(
artifacts = [
"com.google.code.findbugs:jsr305:3.0.2",
"com.google.errorprone:error_prone_annotations:2.11.0",
"com.google.j2objc:j2objc-annotations:1.3",
"org.codehaus.mojo:animal-sniffer-annotations:1.20",
"org.checkerframework:checker-qual:3.12.0",
],
repositories = [
"https://repo1.maven.org/maven2",
],
)
2. एक BUILD फ़ाइल बनाना
अब आपके पास अपना वर्कस्पेस और बाहरी डिपेंडेंसी (अगर लागू हो) की सूची है. अब आपको BUILD
फ़ाइलें बनानी होंगी, ताकि यह बताया जा सके कि आपका प्रोजेक्ट कैसे बनाया जाना चाहिए. Maven में एक pom.xml
फ़ाइल होती है, जबकि Bazel में प्रोजेक्ट बनाने के लिए कई BUILD
फ़ाइलों का इस्तेमाल किया जा सकता है. इन फ़ाइलों में कई बिल्ड टारगेट तय किए जाते हैं, जिनकी मदद से Bazel, इंक्रीमेंटल बिल्ड बनाता है.
BUILD
फ़ाइलों को चरणों में जोड़ें. अपने प्रोजेक्ट के रूट में एक BUILD
फ़ाइल जोड़कर शुरू करें. इसके बाद, Bazel का इस्तेमाल करके शुरुआती बिल्ड करने के लिए इसका इस्तेमाल करें.
इसके बाद, ज़्यादा जानकारी वाले टारगेट के साथ ज़्यादा BUILD
फ़ाइलें जोड़कर, अपने बिल्ड को बेहतर बनाया जा सकता है.
WORKSPACE
फ़ाइल वाली डायरेक्ट्री में, एक टेक्स्ट फ़ाइल बनाएं और उसका नामBUILD
रखें.इस
BUILD
फ़ाइल में, अपने प्रोजेक्ट बनाने के लिए एक टारगेट बनाने के लिए सही नियम का इस्तेमाल करें. इसके लिए, यहां कुछ सुझाव दिए गए हैं:सही नियम का इस्तेमाल करें:
एक Maven मॉड्यूल वाले प्रोजेक्ट बनाने के लिए,
java_library
नियम का इस्तेमाल इस तरह करें:java_library( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], )
एक से ज़्यादा Maven मॉड्यूल वाले प्रोजेक्ट बनाने के लिए,
java_library
नियम का इस्तेमाल इस तरह करें:java_library( name = "everything", srcs = glob([ "Module1/src/main/java/**/*.java", "Module2/src/main/java/**/*.java", ... ]), resources = glob([ "Module1/src/main/resources/**", "Module2/src/main/resources/**", ... ]), deps = ["//:all-external-targets"], )
बाइनरी बनाने के लिए,
java_binary
नियम का इस्तेमाल करें:java_binary( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], main_class = "com.example.Main" )
एट्रिब्यूट की जानकारी दें:
name
: टारगेट को कोई ऐसा नाम दें जो काम का हो. ऊपर दिए गए उदाहरणों में, टारगेट को "सब कुछ" कहा जाता है.srcs
: अपने प्रोजेक्ट में मौजूद सभी .java फ़ाइलों की सूची बनाने के लिए, ग्लोबिंग का इस्तेमाल करें.resources
: अपने प्रोजेक्ट के सभी संसाधनों की सूची बनाने के लिए, ग्लोबिंग का इस्तेमाल करें.deps
: आपको यह तय करना होगा कि आपके प्रोजेक्ट को किन बाहरी डिपेंडेंसी की ज़रूरत है. उदाहरण के लिए, अगर आपनेgenerate_workspace
टूल का इस्तेमाल करके, बाहरी डिपेंडेंसी की सूची जनरेट की है, तोjava_library
के लिए डिपेंडेंसी,generated_java_libraries
मैक्रो में दी गई लाइब्रेरी हैं.
Guava प्रोजेक्ट के माइग्रेशन से जुड़ी इस टॉप-लेवल BUILD फ़ाइल का उदाहरण देखें.
अब आपके प्रोजेक्ट की रूट में
BUILD
फ़ाइल है. इसलिए, अपने प्रोजेक्ट को बिल्ड करके पक्का करें कि वह काम कर रहा है. कमांड लाइन पर, अपनी वर्कस्पेस डायरेक्ट्री में जाकर, Bazel की मदद से प्रोजेक्ट बनाने के लिएbazel build //:everything
का इस्तेमाल करें.प्रोजेक्ट अब Bazel की मदद से बन गया है. प्रोजेक्ट के इंक्रीमेंटल बिल्ड की अनुमति देने के लिए, आपको ज़्यादा
BUILD
फ़ाइलें जोड़नी होंगी.
Guava प्रोजेक्ट का उदाहरण: एक BUILD फ़ाइल से शुरू करें
Guava प्रोजेक्ट को Bazel पर माइग्रेट करते समय, पूरे प्रोजेक्ट को बनाने के लिए शुरुआत में एक BUILD
फ़ाइल का इस्तेमाल किया जाता है. Workspace डायरेक्ट्री में मौजूद इस शुरुआती BUILD
फ़ाइल का कॉन्टेंट यहां दिया गया है:
java_library(
name = "everything",
srcs = glob([
"guava/src/**/*.java",
"futures/failureaccess/src/**/*.java",
]),
deps = [
"@maven//:com_google_code_findbugs_jsr305",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_j2objc_j2objc_annotations",
"@maven//:org_checkerframework_checker_qual",
"@maven//:org_codehaus_mojo_animal_sniffer_annotations",
],
)
3. ज़्यादा BUILD फ़ाइलें बनाना (ज़रूरी नहीं)
Bazel सिर्फ़ एक BUILD file
के साथ काम करता है, जैसा कि आपको अपना पहला बिलट पूरा करने के बाद पता चला था. इसके बावजूद, आपको ज़्यादा टारगेट वाली BUILD
फ़ाइलें जोड़कर, बिल्ड को छोटे हिस्सों में बांटना चाहिए.
एक से ज़्यादा टारगेट वाली कई BUILD
फ़ाइलों से, बंडल को ज़्यादा बारीक जानकारी मिलेगी. इससे ये काम किए जा सकेंगे:
- प्रोजेक्ट के इंक्रीमेंटल बिल्ड में बढ़ोतरी हुई,
- बिल्ड को पैरलल तरीके से चलाने की सुविधा को बेहतर बनाया गया है,
- आने वाले समय में, उपयोगकर्ताओं के लिए बनाए गए बिल्ड को बेहतर तरीके से मैनेज किया जा सकता है.
- पैकेज के बीच टारगेट की दिखने की सुविधा को कंट्रोल किया जा सकता है. इससे, लाइब्रेरी में लागू करने की जानकारी, सार्वजनिक एपीआई में लीक होने जैसी समस्याओं को रोका जा सकता है.
ज़्यादा BUILD
फ़ाइलें जोड़ने के लिए सलाह:
- इसके लिए, हर Java पैकेज में
BUILD
फ़ाइल जोड़ें. सबसे कम डिपेंडेंसी वाले Java पैकेज से शुरू करें और सबसे ज़्यादा डिपेंडेंसी वाले पैकेज पर जाएं. BUILD
फ़ाइलें जोड़ने और टारगेट तय करने के बाद, इन नए टारगेट को उन टारगेट केdeps
सेक्शन में जोड़ें जिन पर ये निर्भर हैं. ध्यान दें किglob()
फ़ंक्शन, पैकेज की सीमाओं को पार नहीं करता. इसलिए, पैकेज की संख्या बढ़ने पर,glob()
से मैच होने वाली फ़ाइलों की संख्या कम हो जाएगी.- जब भी किसी
main
डायरेक्ट्री मेंBUILD
फ़ाइल जोड़ें, तो पक्का करें कि आपने उससे जुड़ीtest
डायरेक्ट्री में भीBUILD
फ़ाइल जोड़ी हो. - ध्यान रखें कि पैकेज के बीच में, प्रॉडक्ट को सही तरीके से सीमित किया गया हो.
BUILD
फ़ाइलों के सेटअप में गड़बड़ियों को हल करने के लिए, पक्का करें कि हर बिल्ड फ़ाइल जोड़ने पर, प्रोजेक्ट Bazel की मदद से बनता रहे.bazel build //...
चलाकर पक्का करें कि आपके सभी टारगेट अब भी बने रहें.
4. Bazel का इस्तेमाल करके बिल्ड करना
आपने Bazel का इस्तेमाल करके बिल्ड किया है, क्योंकि आपने बिल्ड के सेटअप की पुष्टि करने के लिए BUILD
फ़ाइलें जोड़ी हैं.
जब आपके पास ज़रूरत के हिसाब से BUILD
फ़ाइलें हों, तो सभी बिल्ड बनाने के लिए Bazel का इस्तेमाल किया जा सकता है.