Gradle 模块中的 AAR 库依赖项无法解决

12

我是对Gradle不太熟悉的新手,在依赖方面遇到了问题。我的项目结构如下:

-MyApp
-MyAppLibrary
-MyAppPro
-MyAppFree
-ThirdPartyLibraryWrapper
--libs\ThirdPartyLibrary.aar

MyAppProMyAppFree都依赖于MyAppLibrary,而MyAppLibrary又依赖于ThirdPartyLibraryWrapper。正如其名称所示,ThirdPartyLibraryWrapper是对外部库ThirdPartyLibrary.aar的包装。

这是我的配置:

build.gradle MyAppPro

apply plugin: 'com.android.application'
android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.example"
        minSdkVersion 8
        targetSdkVersion 22
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles 'proguard.cfg'
        }
    }
}

dependencies {
    compile project(':MyAppLibrary')
}

建立.gradle MyAppLibrary

apply plugin: 'com.android.library'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 22
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles 'proguard.cfg'
        }
    }
}

dependencies {
    compile project(':ThirdPartyLibraryWrapper')
    compile 'com.squareup.picasso:picasso:2.5.2'
}

build.gradle 第三方库包装器

apply plugin: 'com.android.library'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 22
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles 'proguard.cfg'
         }
    }
}
repositories {
    flatDir {
        dirs 'libs'
     }
}

dependencies {
    compile(name: 'ThirdPartyLibrary-0.1.0', ext: 'aar')
    compile "com.android.support:support-v4:22.0.0"
    compile fileTree(dir: 'libs', include: 'volley.jar')
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'

}

当gradle同步完成后,我遇到了这个错误:

MyApp/MyAppFre/ build.gradle: failed to resolve ThirdPartyLibrary-0.1.0
MyApp/MyAppLibrary/ build.gradle: failed to resolve ThirdPartyLibrary-0.1.0
MyApp/MyAppPro/ build.gradle: failed to resolve ThirdPartyLibrary-0.1.0

有人可以帮我找出问题出在哪里吗?


尝试移除aar名称中的“-”字符。尝试在libs文件夹和gradle文件中更改名称为“ThirdPartyLibrary_0.1.0”。 - Gabriele Mariotti
仍然无法工作。请注意,ThirdPartyLibraryWrapper的构建成功,我认为问题出现在导入其他模块时。 - evi
尝试在其他模块(如MyAppLibrary...)中添加相同的compile(name:'ThirdPartyLibrary-0.1.0',ext:'aar')并将其放置在正确的文件夹中。 - Gabriele Mariotti
我已经测试了这个解决方案,它可以工作,但在这种情况下,我会破坏我的逻辑...而且拥有一个库包装器也没有意义(无论如何我都需要它) - evi
问题在于MyAppLibrary不知道ThirdPartyLibrary-0.1.0:aar的位置。因此,您必须指定存储库以查找它。对于所有依赖项,它都以相同的方式工作。 - Gabriele Mariotti
1个回答

33
其他项目发现:ThirdPartyLibraryWrapper项目依赖于名为ThirdPartyLibrary-0.1.0:aar的构件。Java(和Android)库不会将其自己的依赖项捆绑在一起,而是只发布其依赖项列表。消费方项目负责加载不仅直接依赖的库,还包括所有依赖项该库所依赖的库。
这样做的净效果是:MyAppFree会加载:ThirdPartyLibraryWrapper,然后看到:ThirdPartyLibraryWrapper依赖于ThirdPartyLibrary-0.1.0:aar,因此也会尝试加载它。但是,:MyAppFree不知道ThirdPartyLibrary-0.1.0:aar在哪里,所以它失败了。
解决方案将是在您的所有其他项目中放置类似的repositories块。请尝试以下方法:
repositories {
    flatDir {
        dirs project(':ThirdPartyLibraryWrapper').file('libs')
    }
}

使用project(...).file(...)方法可以避免硬编码路径,并且将使用Gradle DSL通过查找项目来解析文件系统路径并动态进行解析。


Volley.jar被捆绑在ThirdPartyLibrary.aar中。不幸的是,Gradle似乎没有包含.aar文件:警告:项目thirdPartyLibraryWrapper:仅支持Jar类型本地依赖项。无法处理:/MyApp/thirdPartyLibraryWrapper/libs/thirdPartyLibrary-0.1.0.aar - evi
所以你是正确的!我进行了更多的调试,找到了一个可行的解决方案;回答已更新。 - tophyr
感谢详细说明依赖项如何工作。是否可以使用ThirdPartyLibraryWrapper和ThirdPartyLibrary进行捆绑?我认为我更喜欢这种解决方案,以避免破坏我的现有逻辑。 - evi
ThirdPartyLibraryWrapper 项目是否真的有用,或者它仅仅存在是为了让其他项目可以访问 ThirdPartyLibrary?如果是这样的话,那么它是不必要的,你可以将 ThirdPartyLibrary 放在根目录下的 libs/ 文件夹中,并让其他项目直接引用它。 - tophyr
嗨 @evi,不想打扰你,但如果这个答案解决了你的问题,请点击它左侧箭头下方的复选标记接受它。这将使它在搜索结果中更加突出,并帮助其他人找到它!谢谢 :) https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work - tophyr
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接