首页 > 解决方案 > 在Android库中本地添加jar vs maven依赖

问题描述

我在我的 android 库项目中遇到了一种奇怪的行为。我的项目结构和依赖项如下:

应用程序 (.apk) -> 主库 (.aar) -> 通用库 (.aar 但可能是 .jar)

现在,公共库在多个项目之间共享,并具有使用改造依赖项的网络层,准备一个带有 Koin 依赖项和一些其他小依赖项的 di 方案。目前它作为 .aar 文件分发,但这会导致传递依赖的旧问题(它存在于主库的 pom.xml 中)。由于 aar 中没有资源,所以我只需要 classes.jar 文件。因此,我将公共库的发布任务更改为发布类 jar 而不是 .aar:

 publishing {
    publications {
....
       groupId "com.fish.common"
       artifactId "common-lib"
       version  "1.0.0-jar"
       //was:
       //artifact("$buildDir/outputs/aar/${libraryName}.aar")
       //now is:
       artifact("$buildDir/intermediates/aar_main_jar/release/classes.jar")
       //I also publish debug separately but it's omitted for simplicity
    }
....
}

实际上,这会将具有正确工件名称的类 .jar 文件与 pom.xml 一起发布到我的存储库

如果我通常像这样包含它,则在我的主库中没有:

implementation("com.fish.common:common-lib:1.0.0-jar"){
    transitive = false;
}

在我构建并发布主库之后,公共库的依赖项仍然存在于 pom.xml 文件中。

<dependency>
  <groupId>com.fish.common</groupId>
  <artifactId>common-lib</artifactId>
  <version>1.0.0-jar</version>
</dependency>

但是,如果我删除上面的 maven 依赖项并将我的 classes.jar 从 common-library(文件明显重命名)本地添加到我的 main-library 项目中,并像这样包含它:

 implementation fileTree(dir: "libs", include: ["*.jar"])

然后,我的主库 .aar 是使用来自 common-lib 的 .jar 文件构建的,当我构建仅具有主库 .aar 依赖项的 .apk 时,它在运行时工作。

现在你可以看到在本地添加这个文件有点解决我的问题,但是当你想要跟踪版本并且在 CI 构建系统中更复杂时,维护本地依赖项是相当平凡和麻烦的。

所以我的问题是 - 我可以达到与本地依赖相同的效果,但在 maven 存储库中拥有 common-lib 吗?

PS:我知道 fat-aar 插件,但它伴随着它自己的问题和新的构建 gradle 工具的问题让我过去退出它。

标签: mavengradlejarandroid-librarytransitive-dependency

解决方案


推荐阅读