gpt4 book ai didi

android - Gradle/Maven/Android : Library-private dependency not found when library is used via maven

转载 作者:行者123 更新时间:2023-12-04 13:51:01 26 4
gpt4 key购买 nike

我有一个带有库模块的 SampleApp:

:app
:library
该库使用以下依赖项和以下代码:
implementation "com.google.android.gms:play-services-safetynet:17.0.1"

----

import android.content.Context
import com.google.android.gms.safetynet.SafetyNet

class ClassUsingSafetynet {
fun trigger(context: Context) {
SafetyNet.getClient(context)
}
}
SampleApp 正在调用 trigger某处:
val triggerClass = ClassUsingSafetynet()
triggerClass.trigger(context)
只要 SampleApp 直接声明它对库模块的依赖关系,就可以正常工作:
implementation project(path: ':library')
但是,如果我将库 aar 部署到我的本地 maven 并相应地声明依赖项,如下所示:
implementation ('com.myapplication:library:1.0.3@aar') { transitive = true }
我收到以下崩溃
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/safetynet/SafetyNet;
at com.library.ClassUsingSafetynet.trigger(ClassUsingSafetynet.kt:10)
at com.myapplication.MainActivity.onCreate$lambda-0(MainActivity.kt:38)

这是发布 gradle 任务:
afterEvaluate {
publishing {
publications {
release(MavenPublication) {

groupId 'com.myapplication'
artifactId 'library'
version '1.0.3'
artifact 'build/outputs/aar/library-release.aar'

pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')

configurations.api.allDependencies.each {
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
repositories {
mavenLocal()
}
}
}

我尝试使用 api而不是 implementation对于 SafetyNet 依赖项。没有不同。
我尝试设置/不设置 {transitive = true} .没有不同。
我尝试设置/不设置 @aar .没有不同。
我试图不创建 pom 文件。没有不同。
暂时没有应用 ProGuard。

对我来说特别奇怪的是“SafetyNet”是库的私有(private)依赖项。我的应用程序甚至不需要知道它。

最佳答案

发布的 POM 文件需要声明库的所有运行时依赖项,而不仅仅是其 API 依赖项。换句话说,在向 POM 添加依赖项时需要使用以下内容:

    configurations.releaseRuntimeClasspath.allDependencies.each {
// …
}
以下是一个误解:

"SafetyNet" is a private dependency of the library. My app doesn't even need to know about it.


您的应用程序确实不必担心这种“私有(private)依赖”,但它仍然必须(能够)在运行时使其对库可用——因为没有它,库将无法工作,因为它仍然是图书馆。
我已经用一个小的虚拟 Android 项目成功地测试了这个变化。如果您无法使用上述信息使您的构建工作,请告诉我;然后我可以在我的答案中添加一个独立的工作示例项目。

也就是说,我想知道您为什么手动 (a) 指定已发布的 Artifact 并 (b) 创建 POM?以下应该自动工作(如上所述测试):
    release(MavenPublication) {
groupId 'com.myapplication'
artifactId 'library'
version '1.0.3'

from components.release
}
另见 the docs .

关于android - Gradle/Maven/Android : Library-private dependency not found when library is used via maven,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69424629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com