【问题标题】:Import library module that has dependency on local aar file导入依赖于本地 aar 文件的库模块
【发布时间】:2017-05-31 13:03:56
【问题描述】:

我有一个具有以下结构的 Android Instant App:

  • B:基本模块
  • 已安装:已安装应用模块
  • Instant:免安装应用模块
  • F:具有特定于已安装应用程序的功能的功能。 F 依赖于位于project\F\libs 的本地aar 库local-lib

F 的 build.gradle 如下:

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    api ":local-lib@aar"
}

我尝试将F 模块包含到Installed 应用程序模块中,如下所示:

dependencies {
    implementation project(':B')
    implementation project(':F')
}

但是gradle无法解析local-lib,报错:

Error:Could not resolve all dependencies for configuration ':Installed:releaseCompileClasspath'.
> Could not find :local-lib:.
  Searched in the following locations:

      ... some remote repositories ...

  Required by:
      project :Installed > project :F

我尝试将libs 文件夹复制到project\Installed\libs,并且成功了。所以基本上我需要两份local-lib 才能完成这项工作?我应该如何组织导入以避免重复?如果libs 文件夹位于F 模块内,则完美的情况是。

【问题讨论】:

    标签: android gradle android-gradle-plugin android-instant-apps


    【解决方案1】:

    恕我直言,让它工作的最干净的方法是使用一些本地存储库,如 Maven,在此处发布您的 local-lib,并从此处引用它,并对您的每个库执行相同的操作。当您发布到工件存储库管理器(比如说 Maven)时,您的 .aar 将与一个 pom 文件相结合,其中包含所有需要的依赖项。

    您必须记住,您的 aar 是一种平面文件,这意味着,当您在某处引用它时,无法跟踪它的传递依赖关系(这是 的工作pom 文件)。

    这意味着当您在Installed 中引用F 时,会添加F aar,但Installed 不知道它必须得到local-lib 才能按顺序让F 正常工作,或者不知道在哪里。这就是为什么您在远程存储库中有行的原因:gradle 到处搜索(在每个可能的地方 = 在您列出的每个存储库中)以查找依赖项。

    当您将代码复制/粘贴为项目的模块时,gradle 知道什么是传递依赖项,因为它可以访问每个依赖项的 gradle 文件。

    当您将 aar 直接复制到 Installed/libs 文件夹中时,它也可以工作,因为 gradle 在此处检查(您的 gradle 中可能有一个编译行检查该文件夹)。

    如果您想保留平面文件,您应该尝试将所有模块都可以访问的位置放在同一文件夹级别(查看that 问题),或者您可以尝试将 local-lib 添加为Android模块项目,而不仅仅是放在libs文件夹中。

    【讨论】:

    猜你喜欢
    • 2016-08-23
    • 2015-10-23
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    相关资源
    最近更新 更多