如何在Android gradle中使用嵌套依赖项?

时间:2015-11-09 08:23:47

标签: android android-studio gradle

使用gradle时遇到问题:

我有一个库项目,它有两个库模块(称为libA,libB), libA是我推送到本地Maven的项目,而libB是libA的依赖项之一:

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
useLibrary  'org.apache.http.legacy'

defaultConfig {
    applicationId "com.stratbeans.barium.mobilebarium"
    minSdkVersion 16
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:design:23.1.0'
compile files('libs/universal-image-loader-1.9.3.jar')
compile files('libs/listviewanimations_lib-core-slh_3.1.0.jar')
compile project(':ListViewAnimations-core')
compile project(':StickyListHeaders')
compile project(':ListViewAnimations-core-slh')

上传到maven后,我在我的应用程序中使用libA作为依赖

  compile project (':libB')

出于某种原因,我也在应用程序中使用libB的API,所以在我编译时,发生错误,它找不到libB。错误代码:

错误:配置项目':app'时出现问题。

  

无法解析配置':app:_coohuaOnlineTestReleaseCompile'的所有依赖项。   找不到CoohuaFramework:qrscanner:未指定。        在以下位置搜索:            repo1.maven.org/maven2/CoohuaFramework/qrscanner/unspecified/qrscanner-unspecified.pom            repo1.maven.org/maven2/CoohuaFramework/qrscanner/unspecified/qrscanner-unspecified.jar            maven.coohua.com:8002/nexus/content/repositories/releases/CoohuaFramework/qrscanner/unspecified/qrscanner-unspecified.pom            maven.coohua.com:8002/nexus/content/repositories/releases/CoohuaFramework/qrscanner/unspecified/qrscanner-unspecified.jar            jcenter.bintray.com/CoohuaFramework/qrscanner/unspecified/qrscanner-unspecified.pom            https://jcenter.bintray.com/CoohuaFramework/qrscanner/unspecified/qrscanner-unspecified.jar            文件:/Users/douhua/.m2/repository/CoohuaFramework/qrscanner/unspecified/qrscanner-unspecified.pom            文件:/Users/douhua/.m2/repository/CoohuaFramework/qrscanner/unspecified/qrscanner-unspecified.jar            文件:/Users/douhua/Library/Android/sdk/extras/android/m2repository/CoohuaFramework/qrscanner/unspecified/qrscanner-unspecified.pom            文件:/Users/douhua/Library/Android/sdk/extras/android/m2repository/CoohuaFramework/qrscanner/unspecified/qrscanner-unspecified.jar            文件:/Users/douhua/Library/Android/sdk/extras/google/m2repository/CoohuaFramework/qrscanner/unspecified/qrscanner-unspecified.pom            文件:/Users/douhua/Library/Android/sdk/extras/google/m2repository/CoohuaFramework/qrscanner/unspecified/qrscanner-unspecified.jar        要求:            CooHuaClient:app:未指定> com.coohua.framework:CoohuaFramework:1.6.5

我不知道为什么,我也试过'transitive = true',但它没有帮助。

BUT: 当我将libB的所有代码移动到libA作为其中的一部分时。一切正常,我可以在应用程序中使用libB的代码。

有谁可以告诉我为什么会发生这种情况以及如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

不幸的是,您还必须将libB添加为依赖项,因为没有办法自动执行此操作。此外,您不应该将所有代码从libB复制到libA。我发现了困难的方式。

想象一下,创建两个新库libC和libD。 libC需要libA,libD也需要libA。现在如果你在libC和libD中包含libA的代码,你最终会得到很多双重代码。如果你有一个你想同时使用libC和libD的项目,你就会遇到麻烦,因为来自libA的代码变得模棱两可,它提供了两次。

所以,我的推荐,也推动了libB并将compile 'com.luis.lib:libB:1.0'添加到你的build.gradle。

答案 1 :(得分:0)

您已将libA推送到Maven仓库。

因为你的LibA已经

Option Explicit
Sub Button2_Click()

    Dim i&, j&, n& 'as Long
    Dim Ws As Worksheet
    Set Ws = ActiveSheet 

    n = Ws.Cells(Ws.Rows.Count, "A").End(xlUp).Row
          For i = 1 To n
               Select Case .Cells(i, "A").Value2 
                    Case "2015 Xor 2011":   .Cells(i, 2).Value2 = "blue"
                    Case "2001 Xor 2003":   .Cells(i, 2).Value2 = "green"
                    Case "2014 Xor 2006":   .Cells(i, 2).Value2 = "red"
               End Select
               j = j + 1
          Next i
    End With

End Sub
pom文件中的

,libA与libB有依赖关系。

你必须将libB推入Maven Repo

这将解决您的问题,因为当您的项目使用时:

compile project (':libB')

Gradle将解析读取pom文件的嵌套依赖项。

  

我不知道为什么,我也试过'transitive = true',但它没有帮助。

compile 'com.luis.lib:libA:1.0' 表示您要下载嵌套的依赖项。我不认为transitive = false会解决问题,因为你的pom文件中的问题具有未知的依赖性。

  

但是:当我将libB的所有代码移动到libA作为其中的一部分时。一切正常,我可以在应用程序中使用libB的代码。

它解析了因为这样你不会添加依赖,而是将代码嵌入libA中。