2014-09-11 3 views
6
यहाँ

मेरी build.gradle का एक टुकड़ा है:ग्रैडल ट्रांजिटिव निर्भरता बहिष्करण अपेक्षित के रूप में काम नहीं कर रहा है। (मैं कैसे com.google.guava से छुटकारा करते हो: अमरूद-jdk5: 13.0)

compile 'com.google.api-client:google-api-client:1.19.0' 
compile 'com.google.apis:google-api-services-oauth2:v2-rev77-1.19.0' 
compile 'com.google.apis:google-api-services-plus:v1-rev155-1.19.0' 
compile 'com.google.appengine.tools:appengine-gcs-client:0.4.1' 
compile 'com.google.appengine.tools:appengine-mapreduce:0.8' 

जो अमरूद के कई संस्करण के रूप में आप के साथ देख सकते हैं आयात करता है dependencyInsight:

com.google.guava:guava:15.0 (conflict resolution) 

com.google.guava:guava:14.0.1 -> 15.0 
+--- com.googlecode.objectify:objectify:4.1.3 
| \--- default 
\--- net.eusashead.spring:spring-cache-gae:1.0.0.RELEASE 
    \--- default 

com.google.guava:guava:[15.0,15.99] -> 15.0 
+--- com.google.appengine.tools:appengine-gcs-client:0.4.1 
| +--- default 
| +--- com.google.appengine.tools:appengine-mapreduce:0.8 
| | \--- default 
| \--- com.google.appengine.tools:appengine-pipeline:0.2.10 
|   \--- com.google.appengine.tools:appengine-mapreduce:0.8 (*) 
+--- com.google.appengine.tools:appengine-mapreduce:0.8 (*) 
\--- com.google.appengine.tools:appengine-pipeline:0.2.10 (*) 

com.google.guava:guava-jdk5:13.0 
\--- com.google.api-client:google-api-client:1.19.0 
    +--- default 
    +--- com.google.apis:google-api-services-oauth2:v2-rev77-1.19.0 
    | \--- default 
    +--- com.google.apis:google-api-services-plus:v1-rev155-1.19.0 
    | \--- default 
    +--- com.google.appengine.tools:appengine-gcs-client:0.4.1 
    | +--- default 
    | +--- com.google.appengine.tools:appengine-mapreduce:0.8 
    | | \--- default 
    | \--- com.google.appengine.tools:appengine-pipeline:0.2.10 
    |   \--- com.google.appengine.tools:appengine-mapreduce:0.8 (*) 
    +--- com.google.api-client:google-api-client-appengine:1.17.0-rc 
    | \--- com.google.appengine.tools:appengine-gcs-client:0.4.1 (*) 
    +--- com.google.apis:google-api-services-storage:v1-rev1-1.18.0-rc 
    | \--- com.google.appengine.tools:appengine-gcs-client:0.4.1 (*) 
    +--- com.google.apis:google-api-services-bigquery:v2-rev154-1.19.0 
    | \--- com.google.appengine.tools:appengine-mapreduce:0.8 (*) 
    \--- com.google.api-client:google-api-client-servlet:1.17.0-rc 
      \--- com.google.api-client:google-api-client-appengine:1.17.0-rc (*) 

(*) - dependencies omitted (listed previously) 

मैं करने के लिए निर्भरता को दूर करने की कोशिश की है: करके:

compile ('com.google.api-client:google-api-client:1.19.0'){ 
     exclude group: 'com.google.guava', module: 'guava-jdk5' 
    } 
compile ('com.google.api-client:google-api-client:1.19.0'){ 
     exclude group: 'com.google.guava', 
    } 

लेकिन dependencyInsight ही रहता है। मैं भी

compile ('com.google.guava:guava:15.0'){force = true} 

की कोशिश की लेकिन फिर निर्भरता अंतर्दृष्टि ही रहता है। मैं com.google.guava से कैसे छुटकारा पा सकता हूं: guava-jdk5: 13.0?

विवरण: मैं Gradle की कोशिश की है एक खिड़कियों पर 1.2 और 2.1 8.1 बॉक्स

मुझे इस की कोशिश करने के लिए कारण यह अपवाद से छुटकारा पाने के लिए है:

java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch; 
+0

क्या यह लाइब्रेरी दिखाई देती है यदि आप कमांड लाइन पर साफ और निर्माण करते हैं (यानी आईडीई शामिल किए बिना)? – Nick

+0

मैं इसे कमांड लाइन के माध्यम से चला रहा हूं। त्रुटि केवल रन समय – unify

उत्तर

3

ऐसा लगता है कि guava-jdk5 अभी भी बनाए रखा जा रहा है।

compile ('com.google.guava:guava:15.0'){force = true} 
इस के लिए

:

तो मैं इस बदल

compile('com.google.guava:guava-jdk5:17.0') { force = true } 

और वह मेरी समस्या हल कर ली है, अब मैं गूगल एप में 'com.google.common' पैकेज से कक्षाओं का उपयोग कर सकते सभी वर्णित निर्भरताओं के साथ इंजन प्रोजेक्ट

+1

पर होती है, ऐसा लगता है कि जेडीके 5 संस्करण को बनाए रखा नहीं जा रहा है। अमरूद 18.0 तक है, लेकिन jdk5 संस्करण में 18 नहीं है। Http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.google.guava%22%20AND%20a% देखें 3 ए% 22guava-jdk5% 22 – Tom

16

ऐसा लगता है कि अगर कोई अन्य निर्भरता है तो किसी निर्भरता को इंगित नहीं किया जाएगा जो किसी भी exclu के बिना उसी निर्भरता को इंगित करता है des।

आप configuration तथापि के माध्यम से एक निर्भरता बाहर कर सकते हैं:

configurations { 
    all*.exclude group: 'com.google.guava', module:'guava-jdk5' 
} 
+3

यह मेरे लिए काम किया। धन्यवाद! लेकिन व्यक्तिगत रूप से, मुझे ग्रेडल हैंडल निर्भरता के तरीके पसंद नहीं हैं। मेवेन अधिक स्पष्ट और सरल है। –

3

बिल्डिंग पर @thoutbeckers वजह से एक विशेष मामला है, मैं कहाँ नहीं सोचा था कि उसके जवाब के लिए लागू किया को जवाब, लेकिन यह वास्तव में किया था। उम्मीद है कि यह उत्तर उन लोगों की मदद कर सकता है जिन्होंने मेरी विशेष मामला समस्या साझा की है। मूल रूप से मैंने सोचा था कि खराब ट्रांजिटिव निर्भरता केवल build.gradle फ़ाइल में एक निर्भरता द्वारा संदर्भित की गई थी लेकिन वास्तव में इसे दो निर्भरताओं द्वारा संदर्भित किया गया था। ऐसा इसलिए था क्योंकि दोनों निर्भरताएं जहां खराब पारगमन निर्भरता का संदर्भ माता-पिता/बाल संबंध से किया गया था, लेकिन मैंने केवल बाल निर्भरता के साथ संबंधों को देखा, न कि माता-पिता निर्भरता।

निम्नलिखित निर्भरता वृक्ष (आदेश gradle <my-project-name>:dependencies द्वारा उत्पादित) पर विचार करें:

compileClasspath - Compile classpath for source set 'main'. 
+--- my.org:com.my.pkg.parent:6.+ -> 6.0.4 
| +--- # misc. dependencies 
| +--- my.org:com.my.pkg.child:6.0.4 
| | +--- # misc. dependencies 
| | +--- other.org:bad.transitive.dependency:0.9.1 FAILED 
| | +--- # misc. dependencies 
| |--- # misc. dependencies 
+--- # misc. dependencies 

निर्भरता पेड़ से, यह other.org:bad.transitive:dependency:0.9.1 केवल अपने निर्माण फाइल में एक निर्भरता द्वारा संदर्भित है, दो नहीं की तरह दिखता है।हालांकि, अपने Gradle फ़ाइल इस तरह दिखता है लगता है:

// ... misc. ... 
dependencies { 
    // ... misc. dependencies ... 
    compile 'my.org:com.my.pkg.parent:6.+' 
    // ... misc. dependencies ... 
    compile ('my.org:com.my.pkg.child:6.0.4') { 
     exclude group: 'other.org', module: 'bad.transitive.dependency' 
} 

के लिए एक Gradle ऊपर की तरह फाइल, त्रुटि बना रहेगा भले ही सकर्मक निर्भरता तुम बाहर करना चाहते थे इकलौती संतान निर्भरता में, नहीं माता पिता निर्भरता होती है । हालांकि, क्योंकि माता-पिता और बाल परियोजनाओं दोनों को build.gradle फ़ाइल द्वारा संदर्भित किया गया है, खराब ट्रांजिटिव निर्भरता को दोनों निर्भरताओं से बाहर रखा जाना चाहिए, जैसा कि उपरोक्त @thoutbeckers कहा गया है।

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

+0

धन्यवाद! आपके जवाब ने मेरी मदद की। – Mustafa

संबंधित मुद्दे