2013-11-15 59 views
5

我正在使用'com.android.tools.build:gradle:0.6.+'來構建我的android應用程序。管理Android Gradle依賴關係的最佳方法

衆所周知,Android dex不能包含同一庫的不同版本。但是當你想使用Maven依賴關係時,如何處理情況需要一些你已經使用的庫,但只是不同的版本。 示例。 具有的build.gradle文件如下:

dependencies { 
    compile 'com.android.support:appcompat-v7:+' 
    compile 'com.github.chrisbanes.bitmapcache:library:2.3' 
} 

產生錯誤:

UNEXPECTED TOP-LEVEL EXCEPTION: 
    java.lang.IllegalArgumentException: already added: Landroid/support/v4/app/FragmentManager$OnBackStackChangedListener; 
    at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123) 
    at com.android.dx.dex.file.DexFile.add(DexFile.java:163)... 

發生此錯誤的原因如下: http://search.maven.org/remotecontent?filepath=com/github/chrisbanes/bitmapcache/library/2.3/library-2.3.pom需要com.google.android:support-v4

並且com.android.support:appcompat-v7:+已經包含com.google.android:support-v4,結果包含了相同的類文件。

現在我在尋找答案,如: 使用Ant 下載所有的依賴到「庫」文件夾,並使用編譯文件(「...」) 等

變化納入爲了奧斯陸不幫幫我。

我正在尋找強大和方便的解決方案。如何使用maven依賴關係,仍然沒有上述異常?想法? android開發人員如何管理這個?

回答

10

您可以exclude transitive dependencies

dependencies { 
    compile 'com.android.support:appcompat-v7:19.0.0' 
    compile ("com.github.chrisbanes.bitmapcache:library:2.3"){ 
     exclude group: 'com.google.android', module: 'support-v4' 
    } 
} 

據opensourced庫,所以你應該通知作者對這個問題或創建pull請求爲好。

2

問題是bitmapcache特別需要支持庫的r7,而不是允許任何r7 +版本的支持庫。因此,appcompat正在嘗試引入與所需的位圖緩存r7衝突的最新(r19)。

例如,ActionBarSherlock沒有指定支持庫的版本,根據its pom file可以將它與任何版本的支持庫一起使用。

最簡單的解決方案是讓bitmapcache更新以支持更高版本的支持庫。否則,您需要在本地下載和管理依賴項,作爲項目中的附加模塊。

+0

所以,如果我正確地理解你,你認爲在Maven存儲庫中描述的問題是一個Bug,修復maven POM將解決這個問題? –

+0

@ xp-vit - 這是POM需要特定版本的問題,是的。 – ianhanniballake