2014-06-19 15 views
5

में बेस 64 निर्भरता समस्या हम एंड्रॉइड स्टूडियो 0.6.1 का उपयोग ग्रैडल प्लगइन 0.11 के साथ कर रहे हैं। + हमारे वर्तमान प्रोजेक्ट में, और हम commons-codec के साथ एक निर्भरता समस्या में भाग रहे हैं। हम जानते हैं कि एक "क्रिप्टो" सेवा कोड की निम्न दो पंक्तियों का उपयोग करता है जो हमारे स्थानीय Artifactory उदाहरण से निर्भरता कक्षा में खींच रहे:एंड्रॉइड स्टूडियो

byte[] encryptedOutput = cipherFactory.getEncryptCipher().doFinal(plaintext.getBytes()); 
byte[] encryptedCipherText = Base64.encodeBase64URLSafe(encryptedOutput); 

समस्या यह है कि भले ही हम में commons-codec की एक विशिष्ट निर्भरता को परिभाषित हमारे Gradle विन्यास, हम निम्न अपवाद

java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64URLSafe 

सबसे पहले, हम स्वयं के लिए ': कॉमन्स-कोडेक: कॉमन्स-कोडेक 1.9' निर्भरता सहित गया मिलता है, लेकिन एंड्रॉयड स्टूडियो के अनुसार जब मैं कोड में अंदर घुसते आईडीई में, यह उस विधि के संस्करण को 1.9 में देख रहा है, लेकिन जब ऐप चलता है, तो हमें अपवाद मिलता है। यहां तक ​​कि निर्भरता को 1.4 तक बदलना अभी भी विफल रहता है, भले ही वह विधि उपलब्ध हो जब जावाडॉक्स के अनुसार। मैन्युअल निर्भरता को भी हटाकर पूरी तरह से एक ही चीज होती है।

क्या कोई तरीका है कि मैं यह पता लगा सकता हूं कि चल रहा ऐप इस निर्भरता को कहां खींच रहा है? इस पल में हमारी पूरी निर्भरता सूची है, और मैं इन

compile files('libs/HockeySDK-3.0.2.jar') 
compile files('libs/PushIOManager.jar') 
compile 'commons-lang:commons-lang:[email protected]' 
compile 'org.codehaus.jackson:jackson-core-asl:[email protected]' 
compile 'org.codehaus.jackson:jackson-mapper-asl:[email protected]' 
compile 'com.google.android.gms:play-services:4.4.52' 
compile 'com.mcxiaoke.volley:library:1.0.4' 
compile 'fr.avianey:facebook-android-api:[email protected]' 
compile 'javax.validation:validation-api:1.0.0.GA' 

में से किसी से commons-codec नहीं मिल रहा है मुझे डर है कि इस वर्ग Android SDK के द्वारा कहीं दफन है और हम ओवरराइड करने के लिए कोई रास्ता नहीं होगा यह commons-codec के संस्करण का उपयोग करने के लिए जो हमें हमारी लाइब्रेरी का उपयोग करने की अनुमति देगा। और यहां तक ​​कि अगर हम ऐसा कर सकते हैं, तो मुझे ऐसा लगता है कि ऐसा करने से एंड्रॉइड के साथ कुछ मौलिक समस्या हो सकती है। हम (और वर्तमान में) उस क्रिप्टो सेवा वर्ग के स्रोत को हमारे ऐप में खींच सकते हैं और उचित समकक्ष का उपयोग करने के लिए इसे ट्वीक कर सकते हैं, लेकिन इसका मतलब यह है कि जब भी हम एक या दूसरे संस्करण में बदलाव करते हैं, तो हमें रखना होगा उन्हें सिंक में।

कोई विचार?

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

def versionOverrides = [ 
    "commons-codec:commons-codec": "1.9", 
] 

subprojects { 
    configurations.all { 
     resolutionStrategy.eachDependency { DependencyResolveDetails details -> 

      def overrideVersion = versionOverrides[details.requested.group + ":" + details.requested.name] 

      if (overrideVersion != null && details.requested.version != overrideVersion) { 
       logger.info "Overriding dependency ${details.requested.group}:${details.requested.name} version ${details.requested.version} --> $overrideVersion" 
       details.useVersion overrideVersion 
      } 
     } 
    } 
} 
+0

'ग्रेजल निर्भरता' का प्रयास करें –

उत्तर

1

मुझे डर है कि इस वर्ग के लिए Android SDK साथ कहीं दफन है और हम चाहते हैं कि हमें का उपयोग करने की अनुमति देगा commons-codec के एक संस्करण का उपयोग करने के ओवरराइड कर कोई रास्ता नहीं होगा है हमारे पुस्तकालय।

यह वही है जो हो रहा है।
बूट क्लासलोडर को कॉमन्स कोडेक लाइब्रेरी के संस्करण 1.3 से कक्षाओं के साथ प्री-लोड किया गया है।

इस संघर्ष से बचने के लिए आप कॉमन्स कोडेक लाइब्रेरी को पुन: संग्रहित कर सकते हैं (कक्षाओं के पैकेज/नामस्थान का नाम बदलें)। अधिक विस्तृत विवरण के लिए मेरा उत्तर here देखें।

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