如何在不使用 Gradle 复制 jar 的情况下将一个模块的源包含在另一个模块中?

Posted

技术标签:

【中文标题】如何在不使用 Gradle 复制 jar 的情况下将一个模块的源包含在另一个模块中?【英文标题】:How to include sources of one module inside another without copying the jar with Gradle? 【发布时间】:2021-02-02 23:21:52 【问题描述】:

我想将一个 android 库项目拆分为模块。预期的项目结构是:

├─ androidLibraryModule
│
├─ kotlinLibraryModuleA
│
└─ kotlinLibraryModuleB

其中androidLibraryModule 取决于kotlinLibraryModuleAkotlinLibraryModuleB

dependencies 
    implementation project(":kotlinLibraryModuleA")
    implementation project(":kotlinLibraryModuleB")

我将发布的唯一内容是.aar,它是构建androidLibraryModule 的结果,我希望它包含kotlinLibraryModuleAkotlinLibraryModuleA 的代码。 到目前为止,我发现实现这一目标的唯一方法是将kotlinLibraryModuleAkotlinLibraryModuleB.jar 文件复制到androidLibraryModulelibs 文件夹中:

task copyJar(type: Copy) 
    from jar
    into "$project(":androidLibraryModule").projectDir.absolutePath/libs"


jar.finalizedBy(copyJar)

此解决方案有效,但感觉有点像 hack。 这是唯一的解决方案还是有更好的方法来实现这个结果?

编辑:如果 androidLibraryModule 是一个 Android 应用程序模块,则无需复制任务即可工作。

【问题讨论】:

【参考方案1】:

问题是,aar 默认只包含来自其模块的代码和资源。当您创建一个应用程序时,库模块会将其依赖项传递给应用程序,因此所有类都包含在最终的 apk 中。

如果您只想将库发布为aar,您有两种选择:

将依赖项作为 jars 包含在其中 - 这称为 fat jar/aar(快速搜索发现多个插件,但我对其中任何一个都没有经验,因此您需要自己查看) 如果你将库发布到 maven,你可以在 pom.xml 中指定它的依赖关系,例如。这个答案:Android library dependencies missing from POM with Gradle

【讨论】:

我知道这两个选项,正如您在我使用第一个选项的问题中看到的那样(如果这是唯一的方法,我将自己编写插件)。我的问题是“还有其他方法吗?如果没有,为什么?为什么应用程序模块与库模块不同?”

以上是关于如何在不使用 Gradle 复制 jar 的情况下将一个模块的源包含在另一个模块中?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不创建全新文件的情况下修改 .jar 文件? [复制]

如何在不设置密码的情况下在防火墙后面使用 Gradle,只是一个用户?

如何在不使用任何插件的情况下将非 maven 依赖项安装到您的 maven 项目中? [复制]

使用 gradle(不是存储库)构建时使用自定义提供的 .jar 文件? [复制]

如何在不使用滤镜的情况下使图像变暗? [复制]

如何在不复制的情况下使用 std::string?