使用android-gradle 3在Android库中公开支持库依赖的正确方法是什么?

3
我正在开发一个Android库,该库依赖于appcompat-v7。我的消费者也依赖于appcompat-v7。当发布到Maven仓库时,我应该如何最正确地公开我的appcompat依赖关系?
目前我的做法是:
  • appcompat-v7依赖项列为库的implementation依赖项
  • 使用android-maven-publish发布POM文件,这会导致依赖关系被列在"runtime"作用域下
然而,使用这种设置,库的版本优先级会影响到消费者。以下是消费者项目视图中的截图,其中库版本使用v27.0.0,而消费者则设置为26.1.0:

enter image description here

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

是否可以通过不同的库配置来避免这种情况,或者这应该是结果?我是否错误地认为库和消费应用程序中应允许使用不同版本的appcompat库?我是否应该发布多个二进制文件,每个二进制文件针对支持库的不同版本进行编译,以满足任何给定的消费者设置?

1个回答

1

有没有通过不同的库配置来避免这个问题的方法,或者这应该是结果?

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

我是否错误地假设 appcompat 库的不同版本应该可以在库和使用的应用程序中同时存在?

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

我是否应该根据每个消费者的设置发布针对不同支持库版本编译的多个二进制文件?

这是唯一的解决方案,尽管非常痛苦。


我意识到在同一包和名称下不能有多个类。我的想法是客户端只使用他们的版本。这可能可以通过ResolutionStrategy解决?https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html 不管怎样,这是否意味着库的设置是正确的? - Nilzor
很遗憾,目前(至少我不知道如何)无法告诉Gradle使用特定版本的库来满足你的需求。Gradle首先会查找库(包括你的库),并填充库的需求,然后发现有多个版本的同一库,并使用最新的版本。 - JoseF

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