如何在不使用 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
取决于kotlinLibraryModuleA
和kotlinLibraryModuleB
:
dependencies
implementation project(":kotlinLibraryModuleA")
implementation project(":kotlinLibraryModuleB")
我将发布的唯一内容是.aar
,它是构建androidLibraryModule
的结果,我希望它包含kotlinLibraryModuleA
和kotlinLibraryModuleA
的代码。
到目前为止,我发现实现这一目标的唯一方法是将kotlinLibraryModuleA
和kotlinLibraryModuleB
的.jar
文件复制到androidLibraryModule
的libs
文件夹中:
task copyJar(type: Copy)
from jar
into "$project(":androidLibraryModule").projectDir.absolutePath/libs"
jar.finalizedBy(copyJar)
此解决方案有效,但感觉有点像 hack。 这是唯一的解决方案还是有更好的方法来实现这个结果?
编辑:如果 androidLibraryModule
是一个 Android 应用程序模块,则无需复制任务即可工作。
【问题讨论】:
【参考方案1】:问题是,aar
默认只包含来自其模块的代码和资源。当您创建一个应用程序时,库模块会将其依赖项传递给应用程序,因此所有类都包含在最终的 apk 中。
如果您只想将库发布为aar
,您有两种选择:
pom.xml
中指定它的依赖关系,例如。这个答案:Android library dependencies missing from POM with Gradle
【讨论】:
我知道这两个选项,正如您在我使用第一个选项的问题中看到的那样(如果这是唯一的方法,我将自己编写插件)。我的问题是“还有其他方法吗?如果没有,为什么?为什么应用程序模块与库模块不同?”以上是关于如何在不使用 Gradle 复制 jar 的情况下将一个模块的源包含在另一个模块中?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在不创建全新文件的情况下修改 .jar 文件? [复制]
如何在不设置密码的情况下在防火墙后面使用 Gradle,只是一个用户?
如何在不使用任何插件的情况下将非 maven 依赖项安装到您的 maven 项目中? [复制]