【问题标题】:What's the correct way of exposing a support library dependency in an Android library using android-gradle 3?使用 android-gradle 3 在 Android 库中公开支持库依赖项的正确方法是什么?
【发布时间】:2018-04-11 23:13:45
【问题描述】:

我开发了一个安卓库。该库依赖于appcompat-v7。我的消费者也依赖appcompat-v7。发布到 maven 存储库时,如何最正确地从 libray 公开我的 appcompat 依赖项?

我现在在做什么

  • 在库中将 appcompat-v7 依赖项列为 implementation 依赖项
  • 使用 android-maven-publish 发布 POM 文件会导致依赖项与范围“运行时”一起列出

然而,通过这种设置,库的版本偏好会影响消费者。这是消费者项目视图的屏幕截图,其中库版本使用 v27.0.0,消费者设置为 26.1.0:

v27.0.0 优先于 v26.1.0,导致编译器错误(因为片段签名已更改)。

有没有办法通过配置不同的库来避免这种情况,或者应该这是结果吗?假设应该在库和消费应用程序中允许不同版本的 appcompat 库,我错了吗?我是否应该发布多个二进制文件,每个都针对不同版本的支持库编译以满足任何给定的消费者设置?

【问题讨论】:

    标签: android maven gradle dependency-management android-gradle-3.0


    【解决方案1】:

    有没有办法通过配置不同的库来避免这种情况, 还是应该是这个结果?

    不幸的是,这是预期的结果。这个问题的原因是JVM 不允许有多个具有相同包和名称的类。

    假设不同版本的 appcompat 库我错了吗 应该允许在库和消费应用中?

    正如我所说,这是JVM 限制。

    我是否应该发布多个二进制文件,每个都针对一个 不同版本的支持库以满足任何给定的消费者 设置?

    这是您唯一的解决方案,即使这样做也很痛苦。

    【讨论】:

    • 我意识到你不能有多个具有相同包和名称的类。我的想法是客户只使用他们的版本。这也许可以通过 ResolutionStrategy 解决? docs.gradle.org/current/dsl/… 无论如何这意味着库设置是正确的?
    • 不,遗憾的是不可能(至少我不知道如何)告诉 Gradle 用他们的版本来满足您的库要求。 Gradle首先查找库(包括你的)并填写库的要求,后来发现同一个库有多个版本并使用最新版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2018-12-15
    • 2012-10-07
    相关资源
    最近更新 更多