ग्रेडल: वर्गपथ और संकलन निर्भरताओं के बीच अंतर क्या है?


95

जब मैं अपने प्रोजेक्ट में निर्भरता जोड़ रहा हूँ तो मुझे कभी भी यकीन नहीं है कि मुझे क्या उपसर्ग देना चाहिए, जैसे "classpath"या"compile".

उदाहरण के लिए, क्या मेरी निर्भरता नीचे के संकलन समय या क्लासपाथ में होनी चाहिए?

इसके अलावा, यह मेरे अनुप्रयोगों में होना चाहिए build.gradle या मॉड्यूल विशिष्ट build.gradle में?

वर्तमान build.gradle (आवेदन स्तर पर):

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.hibernate:hibernate-core:5.0.5.Final'
    compile 'mysql:mysql-connector-java:5.1.38'
} 

1
मुझे यकीन नहीं कि मैं समझा हूँ। classpathएक वैध निर्भरता गुंजाइश नहीं है।
तुनकी

शायद भ्रमित हो रहे im, वैध निर्भरता स्कोप क्या हैं?
java123999

इस दस्तावेज़ पर एक नज़र डालें: docs.gradle.org/current/userguide/…
तुनकी

एक बात जो मैंने देखी है कि compileOnlyनिर्भरता तो जाती है, project.configurations.compileClasspathलेकिन यहाँ तक नहीं है project.configurations.compile, जैसा कि यहाँ बताया गया है github.com/iboyko/gradle-plugins/issues/5
व्यानिस बिवैनिस

जवाबों:


48

मुझे लगता है कि आप संदर्भित कर रहे हैं compileऔर ब्लॉक के classpathभीतर जा रहा हूँ dependencies {}। यदि ऐसा है, तो वे निर्भरता विन्यास हैं

कॉन्फ़िगरेशन निर्भरता का नाम दिया गया सेट है।

compileविन्यास जावा प्लगइन द्वारा बनाई गई है। classpathविन्यास सामान्यतः में देखा जाता है buildSrc {}ब्लॉक जहां एक निर्भरता की घोषणा करने की जरूरत है build.gradle, खुद के लिए (प्लगइन्स के लिए, शायद)।


धन्यवाद, इसलिए अपने मुख्य बिल्ड.ग्रेड के लिए मुझे क्लासपाथ का उपयोग करने की आवश्यकता नहीं होनी चाहिए?
java123999

@ java123999 नहीं, जब तक आप कस्टम-लिखित प्लगइन्स का उपयोग नहीं करते हैं
एरिक वेंडेलिन

@ EricWendelin जहाँ आप कहते हैं "निर्भरता के भीतर {} ब्लॉक" का अर्थ है "बिल्डडस्क्रिप्ट" निर्भरता {}} ब्लॉक के भीतर "? (मुझे यकीन नहीं है, बस पूछ रहा हूं।)
पाउलो मर्सन

2
इसके dependencies {}अंदर buildscript {}और बाहर दोनों जगह एक ब्लॉक घोषित किया जा सकता है। अंदर होने पर, आप classpathनिर्माण स्क्रिप्ट को संकलित करने के लिए आवश्यक निर्भरता के लिए कॉन्फ़िगरेशन का उपयोग करते हैं ।
एरिक वेंडेलिन

56

यदि buildscript खुद को चलाने के लिए कुछ, उपयोग की जरूरत है classpath

यदि आपके प्रोजेक्ट को चलाने के लिए कुछ चाहिए, संकलन का उपयोग करें ।

buildscript{}ब्लॉक build.gradle खुद के लिए है।

मल्टी-प्रोजेक्ट बिल्डिंग के लिए, शीर्ष-स्तरीय बिल्ड फ़ाइल रूट प्रोजेक्ट के लिए है, विशिष्ट बिल्ड फ़ाइल सब-प्रोजेक्ट (मॉड्यूल) के लिए है।

शीर्ष-स्तरीय बिल्ड फ़ाइल जहां आप सभी उप-परियोजनाओं / मॉड्यूल के लिए कॉन्फ़िगरेशन विकल्प सामान्य जोड़ सकते हैं।

अपने आवेदन की निर्भरता को शीर्ष-स्तरीय बिल्ड फ़ाइल में न रखें, वे अलग-अलग मॉड्यूल build.gradle फ़ाइलों में हैं


पुष्टि करने के लिए: इसका मतलब यह है कि proandroiddev.com/ / a का उपयोग करना चाहिए compileऔर नहीं classpath?
दोपहर

1
लेकिन क्यों नहीं आवेदन की निर्भरता को शीर्ष स्तर की फ़ाइल में ही रखा जाए यदि प्रोजेक्ट में केवल एक मॉड्यूल है, जैसे कि विशिष्ट एंड्रॉइड एप्लिकेशन?
हर्षा

18

अगर मैं सही तरीके से समझूं, तो आप Project.dependenciesस्क्रिप्ट ब्लॉक को स्क्रिप्ट ब्लॉक के साथ भ्रमित कर रहे हैं Project.buildscript.dependencies(ठीक उसी तरह जैसे मैंने इस प्रश्न पर पहुंचने पर किया था)

मैं इसका जवाब देने की कोशिश करूँगा कि मुझे क्या मिला।

मुझे लगता है कि आपको पहले से ही Project.dependenciesस्क्रिप्ट ब्लॉक से परिचित होना चाहिए । इस ब्लॉक में, हम निर्भरता की घोषणा करते हैं जो हमारे स्रोत कोड द्वारा आवश्यक हैं। निर्भरता घोषित करने के कई तरीके हैं जो हमें परियोजना के लिए चाहिए। ग्रैडल ट्यूटोरियल देखें : निर्भरता प्रकार । मैं केवल उस हिस्से का उल्लेख करूंगा जो इस समस्या के लिए सबसे अधिक प्रासंगिक है:

compile 'org.hibernate:hibernate-core:5.0.5.Final'एक मॉड्यूल निर्भरता घोषणा है। संकलित विन्यास (जिसे अब कार्यान्वयन कॉन्फ़िगरेशन द्वारा हटा दिया गया है।) केवल इसके लिए एक कीवर्ड है। Implementation only dependencies.यह एक कीवर्ड नहीं है जो यह वर्णन करता है कि यह किस प्रकार की निर्भरता है (यहाँ पर मैं ट्यूटोरियल में परिभाषित तीन प्रकारों का अनुसरण कर रहा हूँ, अर्थात मॉड्यूल, फ़ाइल, और परियोजना।)

में Gradle ट्यूटोरियल: तर्क बिल्ड आयोजन यह कहते हैं:

यदि आपकी बिल्ड स्क्रिप्ट को बाहरी पुस्तकालयों का उपयोग करने की आवश्यकता है, तो आप उन्हें स्क्रिप्ट की क्लासपाथ पर ही स्क्रिप्ट में जोड़ सकते हैं। आप इसे बिल्डस्क्रिप्ट () विधि का उपयोग करके करते हैं, एक क्लोजर में गुजरता है जो बिल्ड स्क्रिप्ट क्लासपैथ घोषित करता है।

यह उसी तरह से है जिसे आप घोषित करते हैं, उदाहरण के लिए, जावा संकलन क्लासपैथ। आप परियोजना निर्भरता को छोड़कर निर्भरता प्रकारों में वर्णित किसी भी निर्भरता प्रकार का उपयोग कर सकते हैं।

बिल्ड स्क्रिप्ट को क्लाथपथ घोषित करने के बाद, आप अपनी बिल्ड स्क्रिप्ट में कक्षाओं का उपयोग कर सकते हैं क्योंकि आप क्लासपाथ पर किसी भी अन्य कक्षाओं में होंगे।

मुझे उम्मीद है कि चीजें अब आपको स्पष्ट हो रही हैं।

साथ classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"हम स्थापित कर रहे हैं classpathविधि के साथ com.android.tools.build:gradle:${Versions.android_gradle_plugin}जो एक मॉड्यूल निर्भरता कि निर्माण स्क्रिप्ट खुद के बजाय अपनी परियोजना में स्रोत के द्वारा किया जाता है।

दूसरी ओर, compile 'org.hibernate:hibernate-core:5.0.5.Final'हम संकलन विन्यास के साथ आपकी परियोजना के लिए आवश्यक मॉड्यूल निर्भरता की घोषणा कर रहे हैं ।

tl; dr: The classpath, compileऔर implementationये सभी कीवर्ड हैं जिनका उपयोग विभिन्न परिस्थितियों में निर्भरता के खिलाफ किया जा सकता है। पूर्व का उपयोग तब किया जाता है जब आप बिल्ड स्क्रिप्ट पर निर्भरता में पास होना चाहते हैं, और बाद वाला एक कॉन्फ़िगरेशन है जिसे आप घोषित करना चाहते हैं।


1
अच्छा उत्तर। मुझे यह जोड़ना होगा कि न केवल हमें स्वयं ही खोजशब्दों को घूरना चाहिए, जैसा कि ऊपर स्पष्ट रूप से बताया गया है, बल्कि इसके अलावा हमें उन कलाकृतियों को भी ध्यान में रखना चाहिए, जिनका अनुरोध किया जा रहा है क्योंकि अकेले खोजशब्द पूर्ण संदर्भ को परिभाषित नहीं करते हैं। उदाहरण के लिए, 'org.projectlombok:lombok:1.18.4'कोई classpathसंबंध नहीं है क्योंकि यह एक जार है जो केवल संकलन javacसमय के दौरान आवश्यक है लेकिन javaरनटाइम पर आवश्यक नहीं है। इसलिए, सही उपयोग परिभाषित खोजशब्दों और विरूपण साक्ष्य का एक परस्पर क्रिया है। इसका मतलब है, किसी को प्राथमिकता-पूर्व ज्ञान की आवश्यकता है।
eigenfield
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.