2014-06-19 28 views
5

Şu anki projemizde Android Studio 0.6.1 Gradle eklentisi 0.11. + Kullanıyoruz ve biz de commons-codec numaralı telefondan bağımlılık sorunu yaşıyoruz. Biz kod aşağıdaki iki satırı kullanan bir "kripto" hizmetini içeren yerel Artifactory örneğinden bir bağımlılık sınıfında çekiyoruz: sorundurBase64 bağımlıları sorunu Android Studio içinde

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

biz commons-codec belirli bağımlılığını tanımlamak bile bizim Gradle yapılandırma, biz ilk başta

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

, el ': commons-codec'i: commons-codec'i 1.9' için bir bağımlılık dahil edildi aşağıdaki istisna olsun, ama Android Studio göre ben koduna detaya zaman IDE'de, 1.9'da bu yöntemin sürümüne bakıyor, ancak uygulama çalıştırıldığında istisna oluyor. Bu metot kullanıma girdiğinde Javadocs'a göre bile bağımlılığı 1.4'e çevirmek bile başarısız oluyor. Manuel bağımlılığın tamamen kaldırılması bile aynı şeyin gerçekleşmesine neden olur.

Çalışan uygulamanın bu bağımlılığı nereden aldığını öğrenmenin bir yolu var mı? Bu anda bizim tam bağımlılık listesi ve ben Korkum bu sınıf Android SDK ile bir yere gömüldü olmasıdır bu

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' 

herhangi birinden commons-codec bulamıyor ve biz geçersiz kılmak için bir yol olacak kütüphanemizi kullanmamıza izin verecek bir commons-codec versiyonunu kullanmak. Bunu yapabilseydik bile, endişeliyim ki Android'in kendisiyle ilgili bazı temel sorunlara neden olabilir. Uygulamamız içine çekilen bu şifreleme hizmeti sınıfının kaynağına (ve şu anda) sahip olabiliriz ve uygun eşdeğerini kullanması için onu değiştirebiliriz, ancak bu, bir veya diğer sürüme herhangi bir değişiklik yaptığımız zaman, saklamak zorunda kalacağımız anlamına gelir. onları senkronize.

Herhangi bir fikrin var mı?

GÜNCELLEME: Bu özel durumda çalışılan, Gradle derleme dosyalarındaki bağımlılıkları taramaktır ve aradığınız bağımlılık bulunduğunda, geçersiz kılmak kullanmak istediğiniz sürümle ilgilidir. Örneğin:

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

Not bağımlılıkları 'deneyin –

cevap

1

Korkum bu sınıf Android SDK ile bir yere gömüldü ve biz bize kullanmanızı sağlayacak commons-codec bir sürümünü kullanmak için geçersiz kılmak için bir yol gerekir olduğunu bizim kütüphane.

Bu tam olarak ne oluyor.
Önyükleme sınıfı yükleyicisi, Commons Codec kütüphanesinin 1.3 sürümünden alınan sınıflarla önceden yüklenmiştir.

Bu çakışmayı önlemek için Commons Codec kitaplığını yeniden paketleyebilir (sınıflar paketini/ad alanını yeniden adlandırabilirsiniz). Daha ayrıntılı açıklama için benim cevabım here bakın.