Gradle/Maven/Android:通过Maven使用库时没有发现library -private依赖项



我有一个带有库模块的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"是库的私有依赖项。我的应用甚至不需要知道它

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

configurations.releaseRuntimeClasspath.allDependencies.each {
// …
}

下面是一个误解:

"SafetyNet"是库的私有依赖项。我的应用甚至不需要知道它

你的应用确实不应该担心这个"私有依赖",但它仍然必须(能够)使它在运行时对库可用——因为库没有它不能工作,因为它仍然是库的依赖

我已经用一个小的虚拟Android项目成功地测试了这个变化。让我知道,如果你不能得到你的构建工作与上述信息;然后我可以在我的答案中添加一个独立的,工作的示例项目。


也就是说,我想知道为什么您手动地(a)指定发布的工件并(b)创建POM?以下内容应该可以自动工作(如上所述进行测试):

release(MavenPublication) {
groupId 'com.myapplication'
artifactId 'library'
version '1.0.3'
from components.release
}

参见docs.

相关内容

  • 没有找到相关文章

最新更新