AAR文件能否包含传递依赖项?

75

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

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

现在假设我有一个名为B的项目,我们称之为Bar。Bar是一个Android应用程序,它依赖于Foo。

我已经实现了上述内容。然而,当我从Bar中调用Foo中的一个公共静态函数并且它调用了OkHttp时,我收到以下消息:

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

这种事情可能吗?还是Bar需要手动依赖于OkHttp以及Foo所拥有的其他依赖项?


"compile"已被弃用,您应该为库的公共API所需的每个依赖项使用API。有关详细信息,请参阅此答案https://dev59.com/H1cP5IYBdhLWcg3wcZck - Weiyi
1个回答

64

我花了点时间,但最终找到了我想要的答案。只是我之前搜索的方式有些问题。

这个不太常见的答案正好是我需要的:

Transitive dependencies not resolved for aar library using gradle

请注意,依赖项只与aar库相关联,如果它们在maven存储库中托管,在此情况下,因为pom文件未包含在aar文件中。

实质上,我需要添加一个

transitive = true

...到 Bar 的 build.gradle 文件中

示例:

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

这样可以包含我所有的传递库。

但需要注意的是,这可能会导致依赖之间发生冲突(特别是本地依赖),可以通过使用exclude标签解决。


2
我一直在尝试这种方法,但并没有太大的成功。根据之前解释的方法,我的设置应该如下所示: compile ('com.my:library:2.0.1-SNAPSHOT@aar'){ transitive = true } 但是当我将最终库导入到我的项目中时,传递库却丢失了。我不知道该怎么办,有什么想法吗? - Michael Knight
38
如果您使用 flatDir 将 aar 文件作为本地文件导入,则意味着该 aar 不包含传递依赖项,您需要手动包含它们。但是,如果您从 maven 仓库获取 aar,则库会在 pom 文件中描述其使用的所有依赖项,gradle 可以自动获取它们。 - NazarK

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