AAR 可以包含传递依赖吗? [复制]

Posted

技术标签:

【中文标题】AAR 可以包含传递依赖吗? [复制]【英文标题】:Can an AAR include transitive dependencies? [duplicate] 【发布时间】:2014-10-31 03:10:24 【问题描述】:

现在我有一个库项目,比如说项目 Foo,它依赖于像 OkHttp 这样的库。

现在,Foo 有一个 Maven 构建步骤,可以生成 AAR 并将其推送到公共场所。

现在假设我有项目 B,我们将其命名为 Bar。 Bar 是一个 android 应用,Bar 依赖于 Foo。

嗯,我有。但是,当我从 Bar 调用 OkHttp 的 Foo 中的 public static 函数时,我收到以下消息:

java.lang.NoClassDefFoundError: com.squareup.okhttp.OkUrlFactory
            at com.foo.sdk.utils.OkHttpStack.<init>(OkHttpStack.java:15)

这样的事情可能吗?或者 Bar 是否需要手动依赖 OkHttp 以及 Foo 的任何其他依赖项?

【问题讨论】:

compile 已弃用,您应该为库的公共 API 所需的每个依赖项使用 api。请参阅此答案以获取更多详细信息***.com/questions/44413952/… 【参考方案1】:

花了一点时间,但我找到了我想要的东西。这恰好是我对搜索的措辞。

这个鲜为人知的答案正是我想要的:

Transitive dependencies not resolved for aar library using gradle

请注意,首先,如果 aar 库托管在 maven 存储库中,则依赖项仅与 aar 库相关联,因为 pom 文件不包含在 aar 中。

基本上,我需要添加一个

transitive = true

...到酒吧的build.gradle

例子:

compile ('com.foo:FOO:1.0.0@aar')
       transitive=true

这样它就包含了我所有的传递库。

但是请注意,这实际上可能会导致依赖项(尤其是本地依赖项)之间的冲突,可以使用 exclude 标签解决。

【讨论】:

我采用这种方法但没有取得多大成功。根据前面解释的方法,我的设置应该如下:compile ('com.my:library:2.0.1-SNAPSHOT@aar') transitive = true 但是当我在我的项目中导入最终库时,传递库丢失了。我不知道如何继续,有什么想法吗? @MichaelKnight 如果您使用 flatDir 将 aar 作为本地文件包含在内,则意味着 aar 不包含传递依赖项,您应该手动包含它们。但是,如果您从例如 maven repo 中获取 aar,那么库会描述它正在使用的依赖项(在 pom 文件中),并且 gradle 可以自动为您获取它们。

以上是关于AAR 可以包含传递依赖吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何解决本机 Java 或 Kotlin 中的错误“在依赖项的 AAR 元数据中指定的 minCompileSdk (31)”? [复制]

AAR 传递依赖 Google 位置服务

如何通过 AAR 形式集成 leakcanary-android 服务

制作包含依赖库的AAR包

怎么改变android studio中库的aar文件的输出目录

Android Studio找不到module里的aar