我有一个多项目设置。考虑两个独立的应用程序AppA和AppB。AppA有两个库模块modA和modB。modA通过gradle API依赖于modB。
考虑modAbuild.gradle
文件
dependencies {
api project(":mobB")
}
modA有一个文件ModASample.kt
,看起来像
class ModASample{
fun modASample(){
println("modASample")
}
}
modB有一个文件ModBSample.kt
看起来像
class ModBSample{
fun modBSample(){
println("modBSample")
}
}
AppAbuild.gradle
file
dependencies {
implementation project(":modA")
}
来自appAAppASample.kt
中的一个类
class AppASample{
fun access(){
val modA = ModASample() //accessible
val modB = ModBSample() //accessible
}
}
ModASample
和ModBSamle
都是可访问的,这也是预期的,因为modB是通过api
访问在modA中使用的。
当我尝试提取modA
的aar
并尝试在AppB
中使用此aar时,问题出现了。
AppB有build.gradle
文件,看起来像这样
dependencies {
implementation project(":modA")
}
现在准备了modA的aar
,并作为一个单独的模块添加。
从一个类AppBSample.kt
class AppASample{
fun access(){
val modA = ModASample() //accessible
val modB = ModBSample() // NOT ACCESSIBLE
}
}
谁能解释一下为什么会发生这种情况?我期待modB将是可访问的,但如果使用直接aar,情况并非如此。
如有任何建议,我将不胜感激。
AAR不包含传递依赖项,它没有任何包含它们的依赖项列表的pom文件。从我开发的库中查看build.gradle.kts: https://github.com/GiuseppeGiacoppo/RemoteConfig/blob/master/build.gradle.kts
你可以定义一个任务,创建一个包含所有源文件的jar文件。
因为它是kotlin库而不是Android,你应该这样修改它:
val sourcesJar by tasks.creating(Jar::class) {
archiveClassifier.set("sources")
from(android.sourceSets.getByName("main").java.srcDirs)
}
我得到了它与另一个stackoverflow post工作
我能理解的是,在打包aar文件时,提供的依赖声明修饰符(api/implementation)实际上并不包括依赖文件以及包。尽管修饰符(api/implementation)仍然支持其预期用途,但它们似乎并不负责实际将依赖项移动到包中。
因此,为了将依赖关系引入,我们需要显式地将它们打包在一起。在我的例子中,我使用maven发布插件来获得与aar一起打包的依赖项。