स्थानीय .jar फ़ाइल निर्भरता को build.gradle फ़ाइल में कैसे जोड़ें?


605

इसलिए मैंने अपनी build.gradle फ़ाइल में अपनी स्थानीय .jar फ़ाइल निर्भरता को जोड़ने का प्रयास किया है:

apply plugin: 'java'

sourceSets {
    main {
        java {
            srcDir 'src/model'
        }
    }
}

dependencies {
    runtime files('libs/mnist-tools.jar', 'libs/gson-2.2.4.jar')
    runtime fileTree(dir: 'libs', include: '*.jar')
} 

और आप देख सकते हैं कि मैंने संदर्भित। लाइब्रेरी फ़ोल्डर में .jar फाइलें यहां जोड़ीं: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedLbooks

लेकिन समस्या यह है कि जब मैं कमांड चलाता हूं: कमांड लाइन पर ग्रेडेल बिल्ड मुझे निम्न त्रुटि मिलती है:

error: package com.google.gson does not exist
import com.google.gson.Gson;

यहाँ मेरा पूरा रेपो है: https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1


क्या आप संकलन के बजाय रनटाइम के बारे में निश्चित हैं? संकलित फ़ाइलें (....)
गेब्रियल मारीओटी

3
ऐसा लगता है कि यह संकलन निर्भरता है अगर जार का निर्माण नहीं किया जा सकता है। प्रयास करें: संकलित फ़ाइलें ('libs / mnist-tools.jar', 'libs / gson-2.2.4.jar') यदि आपको अभी भी कोई समस्या है तो अनुपस्थित पथों को आज़माएं क्योंकि यह समस्या भी हो सकती है।
देशज जाका फ्रेंका

1
इस स्टैक ओवरफ्लो प्रश्न ने आखिरकार मुझे वह उत्तर दिया जिसकी मुझे आवश्यकता थी।
craned

जवाबों:


455

यदि आपको वास्तव में स्थानीय निर्देशिका से .jar लेने की आवश्यकता है,

अपने मॉड्यूल ग्रैडल के बगल में जोड़ें (एपल फ़ाइल नहीं):

repositories {
   flatDir {
       dirs 'libs'
   }
}


dependencies {
   implementation name: 'gson-2.2.4'
}

हालांकि, एक वास्तविक मावेन भंडार में एक मानक .jar होने के नाते, आप ऐसा क्यों नहीं करते हैं?

repositories {
   mavenCentral()
}
dependencies {
   implementation 'com.google.code.gson:gson:2.2.4'
}

4
मैं ठीक से इसकी तलाश में आया था, लेकिन मैंने पाया कि मेरी स्थानीय रिपॉजिटरी सकर्मक निर्भरता को हल नहीं करती है। (ग्रैडल 2.7, उदाहरण POM है com.mojang: schemlib: 1.5.21 जैसा कि minecraftforge.net द्वारा निकाला गया है
कार्ल द

1
यदि आपके पास कई निर्देशिकाओं में स्थानीय जार फाइलें हैं, तो आपको उन सभी को फ्लैटडिर में जोड़ना होगा। Ex: - फ्लैटडीर {dirs 'libs1', 'libs2', 'libs3'}
धूमिल अग्रवाल

9
मैं एक gradle.buildफाइल कर रहा हूं - ये "ऐप ग्रेड फ़ाइल" और "मॉड्यूल ग्रेडल" क्या है?
लीलो

2
किसी भी मौका किसी को आधिकारिक ग्रेडल प्रलेखन अनुभाग के लिंक के साथ उत्तर को अद्यतन करेगा इन सुविधाओं का वर्णन?
मिसनट्रोप

2
implementation(":gson:2.2.4")ऐसा करने का तरीका लगता है।
Eng.Fouad

697

प्रलेखन के अनुसार , स्थानीय जार निर्भरता के लिए एक रिश्तेदार पथ का उपयोग इस प्रकार है:

dependencies {
    implementation files('libs/something_local.jar')
}

8
@Gubatron अब इसे प्रलेखित किया गया है: gradle.org/docs/current/userguide/…
डेविड मोल्स

7
केवल उन लोगों के लिए जोड़ना चाहते थे, जो हमारे जार के सापेक्ष रास्तों का उपयोग कर रहे हैं: निर्भरता {संकलन फ़ाइलों ("libs / something_local.jar"} (यानी दोहरे-उद्धरण नहीं एकल-उद्धरण) पथ का मूल्यांकन करने के लिए ग्रूवी द्वारा आवश्यक हैं। एकल- ग्रूवी में उद्धरण शाब्दिक रूप से लिए गए हैं।
3

तो मैं एक ही चीज़ का उपयोग कर रहा हूं और मुझे संकलन त्रुटि मिलती है (ऐसा लगता है कि वहां जार नहीं मिलता है।) अगर मैं पूर्ण पथ देता हूं तो यह ठीक काम करता है।
RV_Dev

मैं इस समाधान को पसंद करूंगा, लेकिन मैंने पाया है कि यदि फ़ाइल मौजूद नहीं है, तो ग्रेड के द्वारा कोई त्रुटि उत्पन्न नहीं होती है। मैंने इसे व्यक्तिगत रूप से पाया है, विवरण के लिए यह SO प्रश्न देखें: stackoverflow.com/q/42527631/4851565
entpnerd

मैं इस समाधान का उपयोग करने के बाद भी एक समान त्रुटि प्राप्त कर रहा था। गलती मैंने एप्स के तहत लिबर्स फोल्डर को एप्स के समान स्तर पर नहीं रखा है
ऋषभ दुगर

314

आप यह भी कर सकते हैं जिसमें स्थानीय भंडार में सभी JAR शामिल होंगे। इस तरह आपको इसे हर बार निर्दिष्ट नहीं करना पड़ेगा।

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

3
यह सभी जार को लिबास डायरेक्टरी में संकलित करने के लिए प्रयोग किया जाता है। इसका सही समाधान (y)
शेराज़ अहमद खिलजी

1
... जब तक आप निर्भरता के अलग-अलग सेट वाले मॉड्यूल के साथ उस लिबास डायरेक्टरी को साझा करने की योजना नहीं बनाते हैं, जैसे कि क्लाइंट कोड के साथ सर्वर कोड नहीं डालना, या विभिन्न उप-मॉड्यूल में निर्भरता के एक से अधिक संस्करण होना।
अजाक्स

यह स्वीकृत उत्तर पर मेरा पसंदीदा कार्यान्वयन है क्योंकि यह स्पष्ट रूप से फाइलों के स्थान को बताता है। यह उपयोगी है जब आप कुछ पुस्तकालयों और अन्य के लिए स्थानीय प्रतियों के लिए mavenCentral जैसे भंडार का संदर्भ देते हैं। उस स्थिति में एक लैग हो सकता है जबकि अन्य रिपॉजिटरी में स्थानीय पुस्तकालयों के लिए ग्रेडेल खोज होती है।
satbot

1
ध्यान दें कि डायर एक पूर्ण मार्ग भी हो सकता है। इसके अलावा 'शामिल करें' के बजाय मुझे 'शामिल' करना था।
एरियल मैरीमोन

53

निम्नलिखित मेरे लिए काम करता है:

compile fileTree(dir: 'libs', include: '*.jar')

ग्रैडल डॉक्यूमेंटेशन देखें ।


6
शानदार उत्तर, एकमात्र समाधान जिसने दिनों की खोज के बाद मेरे लिए काम किया
स्टारडस्ट

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

1
यह @ नाइटवॉल्फ के जवाब से अलग कैसे है?
ट्रेंटन

2
प्रकार org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler की वस्तु पर बहस [निर्देशिका 'libs'] के लिए विधि संकलन () नहीं मिल सका
ieXcept

33

आप ग्रेडल के लिए अपने स्थानीय मावेन भंडार का पुन: उपयोग करने का प्रयास कर सकते हैं:

  • जार को अपने स्थानीय मावेन भंडार में स्थापित करें:

    mvn install:install-file -Dfile=utility.jar -DgroupId=com.company -DartifactId=utility -Dversion=0.0.1 -Dpackaging=jar

  • जांचें कि आपके पास जार आपके ~/.m2/स्थानीय मावेन भंडार में स्थापित है

  • अपनी build.gradleफ़ाइल में अपने स्थानीय मावेन भंडार को सक्षम करें :

    repositories {
      mavenCentral()  
      mavenLocal()  
    }
    
    dependencies {  
      implementation ("com.company:utility:0.0.1")  
    }
    • अब आपको अपने प्रोजेक्ट में कार्यान्वयन के लिए सक्षम होना चाहिए

इसने मेरी मदद की जब बाकी सब विफल हो गए!
उपयोगकर्ता 3

हालांकि यह काम करता है, यह एक काम है और इसे स्वचालित उत्पादन / मंच के वातावरण में उपयोग नहीं किया जाना चाहिए क्योंकि यह बिल्ड सिस्टम में .m2 फ़ोल्डर (मावेन इंस्टॉलेशन) होने की एक अतिरिक्त निर्भरता को जोड़ता है।
saurav.varma

29

स्वीकृत उत्तर अच्छा है, हालाँकि, मुझे उसी 3-पार्टी जावा लाइब्रेरी का उपयोग करने के लिए अपने मल्टी-प्रोजेक्ट ग्रैडल बिल्ड के भीतर विभिन्न लाइब्रेरी कॉन्फ़िगरेशन की आवश्यकता होगी।

मेरे ' allprojects ' क्लोजर के भीतर ' dir ' पथ तत्व के लिए ' $ rootProject.projectDir ' को जोड़ने का मतलब है कि प्रत्येक उप-परियोजना ने उसी ' lib ' निर्देशिका को संदर्भित किया , और उस उप-परियोजना के लिए स्थानीय संस्करण नहीं :

//gradle.build snippet
allprojects {
    ...

    repositories {
        //All sub-projects will now refer to the same 'libs' directory
        flatDir {
            dirs "$rootProject.projectDir/libs"
        }
        mavenCentral()
    }

    ...
}

Quizzie द्वारा EDIT: "$ {rootProject.projectDir}" को "$ rootProject.projectDir" (नवीनतम ग्रेड संस्करण में काम करता है) में बदल दिया।


2
लेकिन लाइब्रेरी बिल्ड.ग्रेड फ़ाइल में इस lib फ़ोल्डर को कैसे देखें? उस पर कोई मदद।
जीवा

1
इसे फिर से काम करने के लिए बस "$ {rootProject.projectDir}" को "$ rootProject.projectDir" में बदलें।
क्विज़ी

4
एकल उद्धरणों के बजाय दोहरे उद्धरण चिह्नों का उपयोग करना सुनिश्चित करें क्योंकि उत्तरार्द्ध को प्रक्षेपित नहीं किया जाएगा।
एफपी फ्रीली

1
इस दृष्टिकोण ने मेरी मदद की।
श्रेयश

1
यहां सभी जवाबों ने मुझे बहुत मदद की। यह पैटर्न वह है जिसका हम उपयोग कर रहे हैं और यह टीमों में काम करने वाले लोगों के लिए शाखाओं में काम करने पर सिर्फ JAR को उस निर्देशिका में छोड़ने में आसान बनाता है।
लुसी

12

ऐसा करने का एक सरल तरीका है

compile fileTree(include: ['*.jar'], dir: 'libs')

यह ऐप में आपके लिबास डायरेक्टरी में सभी .jar फ़ाइलों को संकलित करेगा।


क्या फ़ाइलट्री लिबास फ़ोल्डर में सभी उपनिर्देशिकाओं के लिए काम करती है। उदाहरण के लिबास / स्पिंग / स्प्रिंग.जर के अंदर कुछ जार, इस मामले में क्या इसमें स्प्रिंग भी शामिल है।
एमजीआर

नहीं, यह नहीं है। तकनीकी रूप से यह भी नहीं होना चाहिए, क्योंकि हम 'dir: libs' दे रहे हैं न कि सब-लिबिडों के लिबास।
ZygoteInit

इस मामले कैसे कम से कम कार्यों के साथ उप निर्देशिकाओं से सभी पुस्तकालयों पाने के लिए (क्योंकि हमारी परियोजना इतने सारे उपनिर्देशिका शामिल हैं।
एमजीआर

हे @mallikgm देर से जवाब के लिए खेद है, क्या आपने संकलन फ़ाइल की तरह dir पथ में वाइल्डकार्ड जोड़ने की कोशिश की है (शामिल: [[ .jar '], dir:' libs ')
ZygoteInit

2
यह @ नाइटवॉल्फ के जवाब से अलग कैसे है?
ट्रेंटन

10

Kotlin DSL का उपयोग करने वालों के लिए एक समाधान

अब तक जोड़े गए समाधान ओपी के लिए बहुत अच्छे हैं, लेकिन उन्हें पहले अनुवाद किए बिना कोटलिन डीएसएल के साथ उपयोग नहीं किया जा सकता है। यहाँ एक उदाहरण दिया गया है कि कैसे मैंने एक स्थानीय जोड़ा है। कोटल डीएसएल का उपयोग करके अपने निर्माण के लिए .JAR:

dependencies {
    compile(files("/path/to/file.jar"))
    testCompile(files("/path/to/file.jar"))
    testCompile("junit", "junit", "4.12")
}

याद रखें कि यदि आप विंडोज का उपयोग कर रहे हैं, तो आपके बैकस्लैश को बचाना होगा:

...
compile(files("C:\\path\\to\\file.jar"))
...

और यह भी याद रखें कि उद्धरण चिह्नों को दोहरे उद्धरण चिह्नों के होते हैं, एक उद्धरण नहीं।


2020 के लिए संपादित करें:

ग्रेड अपडेट को हटा दिया गया है compileऔर testCompileइसके पक्ष में implementationऔर testImplementation। तो उपरोक्त निर्भरता ब्लॉक वर्तमान ग्रेडल संस्करणों के लिए इस तरह दिखेगा:

dependencies {
    implementation(files("/path/to/file.jar"))
    testImplementation(files("/path/to/file.jar"))
    testImplementation("junit", "junit", "4.12")
}

1
+1 ने मेरे लिए काम किया! क्या आप जानते हैं कि जार फ़ाइल का निर्माण किए बिना कैसे किया जाता है (अगर मैं जार का उत्पादन करने के लिए हुआ था)?
करीम जिरौदी

2
@KareemJeiroudi मैं आपके प्रश्न को गलत समझ सकता हूं, लेकिन यदि आप मॉड्यूल को परियोजना की निर्भरता बनाने की बात कर रहे हैं, तो आप कुछ इस तरह करेंगे: compile(project(":MyProject"))जहाँ "MyProject" को आपकी settings.gradleफ़ाइल में कुछ इस तरह परिभाषित किया गया है include("MyProject")
जोनाथन लैंड्रम

8

मुझे काम करने के लिए https://stackoverflow.com/a/20956456/1019307 पर ऊपर सुझाव नहीं मिला । हालांकि यह मेरे लिए काम किया। secondstring-20030401.jarउस फ़ाइल के लिए जिसे मैंने libs/प्रोजेक्ट के रूट में डायरेक्टरी में संग्रहीत किया है :

repositories {
    mavenCentral()
    // Not everything is available in a Maven/Gradle repository.  Use a local 'libs/' directory for these.
    flatDir {
       dirs 'libs'
   }
}

...

compile name: 'secondstring-20030401'

धन्यवाद! पता नहीं क्यों, लेकिन केवल इसने मेरे लिए काम किया। मेरे प्रोजेक्ट रूट पर एक 'libs' फ़ोल्डर बनाया, वहां .jar को हिलाया और आपके 'संकलित नाम' प्रविष्टि की प्रतिलिपि बनाई। पाठ्यक्रम के भी .jar विस्तार गिरा दिया।
Anon58192932

नहीं, यह मेरे काम नहीं करता है मुझे नहीं मिल सकता है: निम्नलिखित स्थानों में खोज की गई: फ़ाइल: /user/path/to/miglayout-core.jar
खैर स्मिथ

यह कार्य यदि आप एक फ़ाइल निर्देशिका को रिपॉजिटरी के रूप में जोड़ना चाहते हैं: docs.gradle.org/current/userguide/…
Grubhart

7

प्रश्न का पहले ही विस्तार से उत्तर दिया जा चुका है। मैं अभी भी कुछ ऐसा जोड़ना चाहता हूं जो मेरे लिए बहुत ही आश्चर्यजनक है:

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

तो यह जाँचने के लिए आउटपुट पर निर्भर न रहें कि आपकी संदर्भित स्थानीय लीब फाइल सही तरीके से काम कर रही हैं या नहीं।


6

जो समाधान मेरे लिए काम करता है वह build.gradle फ़ाइल में फ़ाइलट्री का उपयोग है। .Jar को रखें जो कि libs फ़ोल्डर में निर्भरता के रूप में जोड़ने की आवश्यकता है। नीचे कोड कोड dependenices में build.gradle में दें:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

5

इसका सबसे अच्छा तरीका यह है कि आप इसे अपनी build.gradle फ़ाइल में जोड़ें और सिंक विकल्प को हिट करें

dependency{
    compile files('path.jar')
}

3

आप जार कर जोड़ सकते हैं:

ग्रेडेल के लिए बस निम्नलिखित कोड डालें build.gradle:

dependencies {
...
compile fileTree(dir: 'lib', includes: ['suitetalk-*0.jar'])
...
}

और मावेन के लिए बस चरणों का पालन करें:

Intellij के लिए: फ़ाइल-> प्रोजेक्ट संरचना-> मॉड्यूल-> निर्भरता टैब-> पर क्लिक करें + साइन-> जार और निर्भरता-> उन चुनिंदा जार को चुनें जिन्हें आप आयात करना चाहते हैं-> ठीक-> लागू करें (यदि दृश्यमान है) -> ठीक

याद रखें कि यदि आपको java.lang.NoClassDefFoundError: Could not initialize classरनटाइम पर कोई अपवाद मिला है तो इसका मतलब है कि जार में निर्भरताएं इसके लिए स्थापित नहीं हैं कि आपको मूल परियोजना में सभी निर्भरताएं जोड़ना होगा।


0

गोटो फ़ाइल -> प्रोजेक्ट संरचना -> मॉड्यूल -> एप्लिकेशन -> निर्भरता टैब -> पर क्लिक करें + (बटन) -> फ़ाइल निर्भरता का चयन करें -> काम फ़ोल्डर में जार फ़ाइल का चयन करें

यह कदम स्वचालित रूप से आपकी निर्भरता को बढ़ा देगा

बहुत आसान


3
यह कुछ जावा आईडीई मेनू के माध्यम से एक रास्ता है? शायद आइडिया?
उत्तगार्द

1
हां, यह इंटेलीजे आईडीईए के लिए कुछ दिखता है, और मुझे नहीं लगता कि यह काम करेगा। या, ऐसा लगेगा कि यह तब तक काम कर रहा है जब तक कि ग्रैडल सेटअप में कोई बदलाव नहीं किया जाता है जिसके परिणामस्वरूप "सिंक्रोनाइज़ेशन" किया जाता है, और सिंक्रनाइजेशन ग्रैड से इंटेलीज सेटिंग्स में एकतरफा होता है। यह दूसरे तरीके से सिंक्रनाइज़ नहीं करता है - कम से कम मुझे ऐसा नहीं लगता।
RenniePet

1
यदि आपके पास स्वचालित आयात चयनित है, तो मैन्युअल रूप से आयातित .JAR को अगले परिवर्तन पर हटा दिया जाएगा build.gradle
जोनाथन लैंड्रम

-1

सावधान रहें यदि आप निरंतर एकीकरण का उपयोग कर रहे हैं, तो आपको अपने बिल्ड सर्वर पर उसी रास्ते में अपने पुस्तकालयों को जोड़ना होगा।

इस कारण से, मैं बल्कि स्थानीय रिपॉजिटरी में जार जोड़ूंगा और निश्चित रूप से, बिल्ड सर्वर पर भी ऐसा ही करूंगा।


-3

दूसरा रास्ता:

ट्री व्यू में लाइब्रेरी जोड़ें। इस पर राइट क्लिक करें। मेनू का चयन करें "लाइब्रेरी के रूप में जोड़ें"। एक संवाद दिखाई देता है, आप मॉड्यूल का चयन करते हैं। ठीक है और हो गया।

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