मावेन के लक्ष्य और चरण क्या हैं और उनके अंतर क्या हैं?


329

मावेन लक्ष्यों और चरणों के बीच अंतर / संबंध क्या है? वे एक दूसरे से कैसे संबंधित हैं?



जवाबों:


251

लक्ष्यों को चरणों में निष्पादित किया जाता है जो आदेश लक्ष्यों को निष्पादित करने में सहायता करने में मदद करता है। इस की सबसे अच्छी समझ डिफ़ॉल्ट मावेन जीवन चक्र बाइंडिंग को देखना है जो दिखाता है कि कौन से लक्ष्यों को डिफ़ॉल्ट रूप से चरणबद्ध रूप से चलाया जाता है। संकलन चरण के लक्ष्यों को हमेशा परीक्षण चरण के लक्ष्यों से पहले निष्पादित किया जाएगा जो हमेशा पैकेज चरण के लक्ष्यों और इतने पर से पहले निष्पादित किया जाएगा।

भ्रम का हिस्सा इस तथ्य से बढ़ा है कि जब आप मावेन निष्पादित करते हैं तो आप एक लक्ष्य या एक चरण निर्दिष्ट कर सकते हैं। यदि आप एक चरण निर्दिष्ट करते हैं तो मावेन आपके द्वारा निर्दिष्ट चरण में सभी चरणों को चलाएगा (जैसे यदि आप पैकेज निर्दिष्ट करते हैं तो यह पहले संकलन चरण और फिर परीक्षण चरण और अंत में पैकेज चरण के माध्यम से चलेगा) और प्रत्येक चरण के लिए यह होगा उस चरण से जुड़े सभी लक्ष्य चलाएं।

जब आप अपनी मावेन बिल्ड फ़ाइल में एक प्लगइन निष्पादन बनाते हैं और आप केवल लक्ष्य को निर्दिष्ट करते हैं तो यह उस लक्ष्य को एक निश्चित डिफ़ॉल्ट चरण में बांध देगा। उदाहरण के लिए, jaxb: xjc लक्ष्य डिफ़ॉल्ट रूप से जनरेट-रिसोर्स चरण में बांधता है। हालाँकि, जब आप निष्पादन को निर्दिष्ट करते हैं तो आप उस लक्ष्य के लिए चरण को भी स्पष्ट रूप से निर्दिष्ट कर सकते हैं।

यदि आप मावेन को निष्पादित करते समय एक लक्ष्य निर्दिष्ट करते हैं तो यह उस लक्ष्य को और केवल उस लक्ष्य को चलाएगा। दूसरे शब्दों में, यदि आप जार: जार लक्ष्य को निर्दिष्ट करते हैं तो यह केवल जार को चलाएगा: जार कोड को अपने कोड को जार में पैकेज करने के लिए। यदि आपने पहले संकलन लक्ष्य नहीं चलाया है या अपने संकलित कोड को किसी अन्य तरीके से तैयार किया है तो यह बहुत असफल हो सकता है।


11
मैं यह कहने के लिए एक आदत "Maven कर दिया है गुजरता सभी चरणों (अप करने के लिए और दिए गए सहित)" के बजाय "रन" या "निष्पादित" (बाद के रूप में यह Maven के दशक में कहा जाता है बिल्ड जीवनचक्र का परिचय )। लक्ष्य के कोड से ऐसा अलग होना जो वास्तव में निष्पादित हो। लेकिन यह व्यक्तिगत स्वाद हो सकता है।
GeroldBroser ने मोनिका

लेकिन हम ऐसे लक्ष्यों को भी चला सकते हैं जो किसी भी चरण से संबंधित नहीं हैं, यानी mvn archetype:generateऔर उस मामले में केवल लक्ष्य को निष्पादित करता है?
क़ाज़ी इरफ़ान

1
@ पेस क्या आपके पास अंतिम पैराग्राफ का संदर्भ है? मुझे उस पर शक हो रहा है और इसे एक सरल परियोजना के साथ यहाँ आज़माया गया है: mvn testरन:, --- maven-resources-plugin:2.6:resources ... --- maven-compiler-plugin:3.1:compile ... --- maven-resources-plugin:2.6:testResources ... --- maven-compiler-plugin:3.1:testCompile ... --- maven-surefire-plugin:2.12.4:testजबकि mvn compiler:testCompileबस चलता है --- maven-compiler-plugin:3.1:testCompile ...
GeroldBroser ने मोनिका

4
@ पेस mvn clean compiler:testCompileरन के --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompileसाथ विफल रहता है Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-cli) on project mvnphase: Compilation failure ... cannot find symbol ... symbol: variable MvnPhase(जहां MvnPhaseपरीक्षण कक्षा में संदर्भित परीक्षण के तहत कक्षा है)। यदि किसी लक्ष्य को सामूहिक रूप से आमंत्रित किया जाता है, तो स्पष्ट रूप से चरणों का आह्वान नहीं किया जाता है।
GeroldBroser ने मोनिका

1
Geroldbroser और @ kekko12 के इनपुट के आधार पर मैंने अंतिम पैराग्राफ़ को यह बताने के लिए अद्यतन किया है कि जब कोई लक्ष्य निर्दिष्ट किया जाता है, तो केवल वह लक्ष्य चलाया जाता है, और सभी पूर्ववर्ती चरण नहीं।
पेस 13

188

जीवन चक्र नाम चरणों का एक क्रम है ।
चरण क्रमिक रूप से निष्पादित होते हैं। किसी चरण को निष्पादित करने का मतलब पिछले सभी चरणों को निष्पादित करता है।

प्लगइन का एक संग्रह है लक्ष्यों (यह भी कहा जाता है मोजो एम Aven हे ld जम्मू एवा हे bject)।
सादृश्य: प्लगइन एक वर्ग है और लक्ष्य वर्ग के भीतर विधियां हैं।

मावेन एक बिल्ड लाइफ साइकिल की केंद्रीय अवधारणा के आसपास आधारित है । प्रत्येक के अंदर बिल्ड जीवन चक्र देखते हैं चरण बिल्ड , और प्रत्येक के अंदर के चरण बिल्ड देखते हैं लक्ष्य बिल्ड

हम एक निर्माण चरण या निर्माण लक्ष्य पर अमल कर सकते हैं। बिल्ड चरण को निष्पादित करते समय हम उस बिल्ड चरण के सभी निर्माण लक्ष्यों को निष्पादित करते हैं। बिल्ड लक्ष्य एक या अधिक चरणों के निर्माण के लिए दिए गए हैं। हम एक निर्माण लक्ष्य को सीधे निष्पादित भी कर सकते हैं।

तीन प्रमुख बिल्ट-इन बिल्ड लाइफ साइकिल हैं :

  1. चूक
  2. स्वच्छ
  3. साइट

प्रत्येक बिल्ड लाइफसाइकल चरणों से बना है

उदाहरण के लिए defaultजीवनचक्र में निम्नलिखित बिल्ड चरण शामिल हैं :

◾validate - validate the project is correct and all necessary information is available
◾compile - compile the source code of the project
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
◾package - take the compiled code and package it in its distributable format, such as a JAR.
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run
◾verify - run any checks to verify the package is valid and meets quality criteria
◾install - install the package into the local repository, for use as a dependency in other projects locally
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

इसलिए उपरोक्त चरणों से गुजरने के लिए, हमें केवल एक कमांड को कॉल करना होगा:

mvn <phase> { Ex: mvn install }

पहले चरण से शुरू होने वाले उपरोक्त आदेश के लिए, सभी चरणों को 'इंस्टॉल' चरण तक क्रमिक रूप से निष्पादित किया जाता है। mvnनिम्नानुसार एक लक्ष्य या एक चरण (या यहां तक ​​कि कई लक्ष्य या कई चरण) निष्पादित कर सकते हैं:

mvn clean install plugin:goal  

हालाँकि, यदि आप अपने प्लगइन को संदर्भित करने के लिए उपयोग किए गए उपसर्ग को अनुकूलित करना चाहते हैं, तो आप maven-plugin-pluginअपने प्लगइन के पीओएम में कॉन्फ़िगरेशन पैरामीटर के माध्यम से सीधे उपसर्ग निर्दिष्ट कर सकते हैं

एक बिल्ड चरण प्लगिन लक्ष्यों से बना है

मावेन की अधिकांश कार्यक्षमता प्लगइन्स में है। एक प्लगइन लक्ष्यों का एक सेट प्रदान करता है जिसे निम्नलिखित सिंटैक्स का उपयोग करके निष्पादित किया जा सकता है:

 mvn [plugin-name]:[goal-name]

उदाहरण के लिए, एक जावा प्रोजेक्ट को संकलक-प्लगइन के संकलन-लक्ष्य के साथ चलाकर संकलित किया जा सकता है mvn compiler:compile

बिल्ड जीवनचक्र नामित चरणों की एक सूची है जिसका उपयोग लक्ष्य निष्पादन के लिए आदेश देने के लिए किया जा सकता है।

प्लगइन्स द्वारा दिए गए लक्ष्य जीवनचक्र के विभिन्न चरणों से जुड़े हो सकते हैं। उदाहरण के लिए, डिफ़ॉल्ट रूप से, लक्ष्य चरण केcompiler:compile साथ जुड़ा हुआ है , जबकि लक्ष्य चरण के साथ जुड़ा हुआ है । निम्नलिखित आदेश पर विचार करें: compile surefire:testtest

mvn test

जब पूर्ववर्ती आदेश को निष्पादित किया जाता है, तो मावेन चरण के प्रत्येक चरण तक और उससे जुड़े सभी लक्ष्यों को चलाता है test। ऐसे मामले में, मावेन चरण से resources:resourcesजुड़े लक्ष्य को चलाता है process-resources, फिर compiler:compile, और तब तक जब तक कि वह अंत में surefire:testगोल नहीं चलाता ।

हालाँकि, भले ही एक बिल्ड चरण बिल्ड जीवन चक्र में एक विशिष्ट चरण के लिए ज़िम्मेदार हो, लेकिन जिस तरह से यह उन जिम्मेदारियों को वहन करता है वह भिन्न हो सकता है। और यह उन बिल्ड चरणों के लिए बाध्य प्लगइन लक्ष्यों को घोषित करके किया जाता है।

एक प्लगइन लक्ष्य एक विशिष्ट कार्य (बिल्ड चरण की तुलना में महीन) का प्रतिनिधित्व करता है जो परियोजना के निर्माण और प्रबंधन में योगदान देता है। यह शून्य या अधिक बिल्ड चरणों के लिए बाध्य हो सकता है। किसी भी निर्माण चरण के लिए बाध्य नहीं होने वाले लक्ष्य का निर्माण जीवनचक्र के बाहर प्रत्यक्ष आह्वान द्वारा किया जा सकता है। निष्पादन का क्रम उस क्रम पर निर्भर करता है जिसमें लक्ष्य (एस) और बिल्ड चरण (ओं) को लागू किया जाता है। उदाहरण के लिए, नीचे दिए गए आदेश पर विचार करें। cleanऔर packageतर्क, निर्माण चरण होते हैं, जबकि dependency:copy-dependencies(एक प्लगइन की) एक लक्ष्य है।

mvn clean dependency:copy-dependencies package

यदि इसे निष्पादित किया जाना था, तो cleanचरण को पहले निष्पादित किया जाएगा (जिसका अर्थ है कि यह स्वच्छ जीवनचक्र के सभी पूर्ववर्ती चरणों को चलाएगा, साथ ही cleanचरण), और फिर dependency:copy-dependenciesलक्ष्य को अंतिम रूप से निष्पादित करने से पहले packageचरण (और उसके सभी पूर्ववर्ती चरणों का निर्माण करेगा) डिफ़ॉल्ट जीवनचक्र)।

इसके अलावा, यदि कोई लक्ष्य एक या अधिक चरणों का निर्माण करने के लिए बाध्य है, तो उस लक्ष्य को उन सभी चरणों में बुलाया जाएगा।

इसके अलावा, एक निर्माण चरण में शून्य या उससे अधिक गोल भी हो सकते हैं। यदि एक बिल्ड चरण के पास कोई लक्ष्य नहीं है, तो वह बिल्ड चरण निष्पादित नहीं करेगा। लेकिन अगर इसके पास एक या अधिक लक्ष्य हैं, तो यह उन सभी लक्ष्यों को पूरा करेगा।

अंतर्निहित जीवनचक्र बाइंडिंग
कुछ चरणों में डिफ़ॉल्ट रूप से उनके लिए लक्ष्य होते हैं। और डिफ़ॉल्ट जीवनचक्र के लिए, ये बाइंडिंग पैकेजिंग मूल्य पर निर्भर करती है।

मावेन वास्तुकला:

यहां छवि विवरण दर्ज करें

संदर्भ 1
संदर्भ २

मैवेन लाइफसाइकल मैपिंग के लिए ग्रहण का नमूना

मैवेन लाइफसाइकल मैपिंग के लिए ग्रहण का नमूना


अगर मेरे पास 2 प्रोफ़ाइल हैं, तो क्या मैं प्रोफ़ाइल 1 के सभी प्लग इन को पहले चला सकता हूँ, और फिर प्रोफ़ाइल 2 का?
मधुमक्खी

[plugin-name]उदाहरण mvn [plugin-name]:[goal-name]में बल्कि एक प्लगइन उपसर्ग हैmvn clean installन केवल " एक मल्टी-मॉड्यूल परिदृश्य में उपयोग किया जा सकता है "। मल्टी-मॉड्यूल एक बिल्कुल अलग विषय है।
गेरोल्डब्रोज़र मोनिका

क्या एक ही चरण से जुड़े लक्ष्य किसी भी आदेश का पालन करते हैं?
इल घीज

5
इस पाठ का अधिकांश भाग मावेन प्रलेखन से शब्दशः कॉपी किया गया है । यह स्पष्ट रूप से कहा जाना चाहिए!
Lii

भयानक स्रोत!
बोबो

45

चुना गया उत्तर बहुत अच्छा है, लेकिन फिर भी मैं इस विषय में कुछ जोड़ना चाहूंगा। एक उदाहरण।

यह स्पष्ट रूप से प्रदर्शित करता है कि अलग-अलग चरणों को अलग-अलग प्लगइन्स पर कैसे बांधा जाता है और उन प्लगइन्स को जो लक्ष्य सामने आते हैं।

तो, चलिए कुछ को चलाने के मामले की जाँच करते हैं mvn compile:

  • यह एक चरण है जो संकलक लक्ष्य के साथ संकलक प्लगइन को निष्पादित करता है
  • कंपाइलर प्लगइन को अलग-अलग लक्ष्य मिले। इसके mvn compileलिए एक विशिष्ट लक्ष्य, संकलित लक्ष्य के लिए मैप किया गया है।
  • यह चलने जैसा ही है mvn compiler:compile

इसलिए, चरण प्लगइन लक्ष्यों से बना है

यहां छवि विवरण दर्ज करें

संदर्भ से लिंक करें


20
क्यों है mvn testकी ओर इशारा करते packageहैं, और mvn installकी ओर इशारा करते deploy?
अब्दुल

2
एक त्रुटि त्रुटि की तरह दिखता है, ध्यान देने के लिए धन्यवाद (इसे वेब में स्थापित किया गया है)।
जॉनी

3
आपको चित्रण कहां से मिला? क्या आपने कॉपीराइट और उपयोग की शर्तों की जांच की?
अब्दुल

1
@ अब्दुल छवि यहाँ से ली गई है carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/… (और यह कई अन्य वेब पेजों में भी दिखाई देती है) इसे उत्तर में जोड़ते हैं। इस बिंदु को बढ़ाने के लिए धन्यवाद, इसके महत्व के बारे में पता नहीं था।
जॉनी

1
आरेख में चरणों से प्लगइन्स तक संकेत बिल्कुल सही नहीं हैं, jarप्लगइन वास्तव में packageचरण में चलता है । और चरणों और प्लगइन्स के बीच सैंडविच में पोम थोड़ा भ्रामक है (मुझे लगता है कि इसका मतलब यह होना चाहिए कि पोम में आप डिफ़ॉल्ट बाइंडिंग के अलावा कौन से प्लग इन चरणों में चला सकते हैं) को कॉन्फ़िगर कर सकते हैं। सामान्य सिद्धांत सही है, यद्यपि।
अलेक्जेंडर क्लिमेटशेक

43

मावेन साइट के पेज इंट्रोडक्शन टू बिल्ड लाइफसाइकल पर परिभाषाएँ विस्तृत हैं , लेकिन मैंने संक्षेप में बताने की कोशिश की है :

मावेन एक निर्माण प्रक्रिया के 4 मदों को परिभाषित करता है:

  1. जीवन चक्र

    तीन में निर्मित lifecycles (उर्फ निर्माण lifecycles ): default, clean, site। ( जीवनचक्र संदर्भ )

  2. चरण

    प्रत्येक जीवन चक्र से बना है चरणों के लिए, जैसे defaultजीवन चक्र: compile, test, package, install, आदि

  3. लगाना

    एक कलाकृति जो एक या अधिक लक्ष्य प्रदान करती है।

    पैकेजिंग के प्रकार ( jar, warआदि) के आधार पर , प्लगइन्स के लक्ष्य डिफ़ॉल्ट रूप से चरणों में बंधे होते हैं। ( अंतर्निहित जीवनचक्र बाइंडिंग )

  4. लक्ष्य

    वह कार्य (क्रिया) जिसे अंजाम दिया गया हो। एक प्लगइन में एक या अधिक गोल हो सकते हैं।

    पीओएम में एक प्लगइन को कॉन्फ़िगर करते समय एक या अधिक लक्ष्यों को निर्दिष्ट करने की आवश्यकता होती है । इसके अतिरिक्त, यदि किसी प्लगइन में एक डिफ़ॉल्ट चरण परिभाषित नहीं है, तो निर्दिष्ट लक्ष्य (एस) एक चरण के लिए बाध्य हो सकता है।

मावेन के साथ मंगाया जा सकता है:

  1. एक चरण (जैसे clean, package)
  2. <plugin-prefix>:<goal>(उदा dependency:copy-dependencies)
  3. <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>(उदा org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile)

किसी एक या सभी के एक या अधिक संयोजनों के साथ, जैसे:

mvn clean dependency:copy-dependencies package

केवल जीवनचक्र के चरणों को वास्तव में "कदम" (एक निर्माण प्रक्रिया का) माना जाता है । मैं इसे 4 संस्थाओं / वस्तुओं / चीजों को कॉल करूंगा
GeroldBroser ने मोनिका

जब मैं दुनिया को देखता हूं Build Phase, तो मैं इसे एक जीवनचक्र के दूसरे चरण के रूप में समझता हूं, और यह मुझे भ्रमित करता है।
क़ाज़ी इरफ़ान

26

मेरा मानना है कि एक अच्छा जवाब पहले से ही प्रदान की जाती है, लेकिन मैं अलग 3 जीवन-चक्र (का एक आसान करने के लिए अनुवर्ती चित्र जोड़ना चाहते हैं build, cleanऔर site) और प्रत्येक में चरणों।

यहां छवि विवरण दर्ज करें

बोल्ड में चरण - आमतौर पर उपयोग किए जाने वाले मुख्य चरण हैं।


2
generate-resourcesदो बार दिखाई देता है और generate-sourcesगायब है।
इलिंगिरोजो

12

इसका श्रेय संदीप जिंदल और प्रेमराज को जाता है। उनका स्पष्टीकरण मुझे इस बारे में थोड़ी देर के बाद भ्रमित होने में समझने में मदद करता है।

मैंने कुछ पूर्ण कोड उदाहरण और कुछ सरल व्याख्याएं यहां बनाईं https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ । मुझे लगता है कि इससे दूसरों को समझने में मदद मिल सकती है।

लिंक से संक्षेप में, आपको तीनों को एक साथ समझने की कोशिश नहीं करनी चाहिए, पहले आपको इन समूहों में संबंध को समझना चाहिए:

  • जीवन चक्र बनाम चरण
  • प्लगइन बनाम लक्ष्य

1. जीवन चक्र बनाम चरण

जीवन चक्र का एक संग्रह है चरण अनुक्रम में यहाँ देख जीवन चक्र संदर्भ । जब आप किसी चरण को कॉल करते हैं , तो यह सभी चरण को भी इससे पहले कॉल करेगा ।

उदाहरण के लिए, स्वच्छ जीवन चक्र के 3 चरण होते हैं ( पूर्व-स्वच्छ, स्वच्छ, पश्च-स्वच्छ )।

mvn clean

इसे प्री-क्लीन और क्लीन कहा जाएगा

2. प्लगइन बनाम लक्ष्य

लक्ष्य प्लगइन में एक कार्रवाई की तरह है । इसलिए यदि प्लगइन एक वर्ग है, तो लक्ष्य एक विधि है।

आप इस तरह एक लक्ष्य को कॉल कर सकते हैं:

mvn clean:clean

इसका अर्थ है "स्वच्छ लक्ष्य को कॉल करें, स्वच्छ प्लगइन में" (यहां कुछ भी साफ चरण से संबंधित नहीं है। "स्वच्छ" शब्द को आपको भ्रमित न करने दें, वे समान नहीं हैं!)

3. अब चरण और लक्ष्य के बीच का संबंध:

लक्ष्य (ओं) के चरण (पूर्व) लिंक कर सकते हैं। उदाहरण के लिए, सामान्य रूप से, स्वच्छ चरण स्वच्छ लक्ष्य से जुड़ता है। इसलिए, जब आप इस आदेश को कहते हैं:

mvn clean

यह पूर्व-स्वच्छ चरण और स्वच्छ चरण को कॉल करेगा जो स्वच्छ: स्वच्छ लक्ष्य से जोड़ता है।

यह लगभग समान है:

mvn pre-clean clean:clean

अधिक विवरण और पूर्ण उदाहरण https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ में हैं


2

Maven कार्यरत शब्दावली जिसमें चरण और लक्ष्य होते हैं।

चरण: मेवेन चरण कार्रवाई का एक सेट है जो 2 या 3 लक्ष्यों से जुड़ा होता है

exmaple: - यदि आप mvan को क्लीन चलाते हैं

यह चरण मवन क्लीन: क्लीन को निष्पादित करेगा

लक्ष्य: चरण के साथ बंधे मावेन गोल

संदर्भ के लिए http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html


4
यह आवश्यक रूप से "2 या 3 लक्ष्यों से जुड़ा होना " नहीं है। यह कोई भी हो सकता है , एक या तीन से अधिक , साथ ही।
GeroldBroser ने मोनिका

1

निम्नलिखित तीन बिल्ट-इन बिल्ड जीवनचक्र हैं:

  • चूक
  • स्वच्छ
  • साइट

जीवनचक्र डिफ़ॉल्ट -> [मान्य करें, आरंभ करें, उत्पन्न-स्रोत, प्रक्रिया-स्रोत, उत्पन्न-संसाधन, प्रक्रिया-संसाधन, संकलन, प्रक्रिया-वर्ग, जनन-परीक्षण-स्रोत, प्रक्रिया-परीक्षण-स्रोत, जनन-परीक्षण-संसाधन, प्रक्रिया -टेस्ट-रिसोर्स, टेस्ट-कंपाइल, प्रोसेस-टेस्ट-क्लास, टेस्ट, तैयारी-पैकेज, पैकेज, प्री-इंटीग्रेशन-टेस्ट, इंटीग्रेशन-टेस्ट, पोस्ट-इंटीग्रेशन-टेस्ट, वेरिफाई, इंस्टॉल, तैनाती]

जीवनचक्र साफ -> [पूर्व-स्वच्छ, स्वच्छ, पश्च-स्वच्छ]

जीवनचक्र साइट -> [पूर्व-साइट, साइट, पोस्ट-साइट, साइट-परिनियोजन]

प्रवाह अनुक्रमिक है, उदाहरण के लिए, डिफ़ॉल्ट जीवनचक्र के लिए, यह मान्य से शुरू होता है , फिर आरंभ होता है और इसी तरह ...

आप डिबग मोड को सक्षम करके जीवनचक्र की जाँच कर सकते हैं mvn,mvn -X <your_goal>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.