首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Gradle/ maven /Android:库-在通过maven使用库时找不到私有依赖

Gradle/ maven /Android:库-在通过maven使用库时找不到私有依赖
EN

Stack Overflow用户
提问于 2021-10-03 11:58:12
回答 1查看 198关注 0票数 4

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

代码语言:javascript
运行
复制
:app
:library

库使用以下依赖项和以下代码:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
val triggerClass = ClassUsingSafetynet()
triggerClass.trigger(context)

只要SampleApp直接声明它对库模块的依赖,它就能正常工作:

代码语言:javascript
运行
复制
implementation project(path: ':library')

但是,如果我将库aar部署到本地maven并相应地声明依赖项,如下所示:

代码语言:javascript
运行
复制
implementation ('com.myapplication:library:1.0.3@aar') { transitive = true }

我得到了下面的崩溃

代码语言:javascript
运行
复制
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)

下面是发布级任务:

代码语言:javascript
运行
复制
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“是库的一个私有依赖项。我的应用程序甚至不需要知道它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-06 15:06:01

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

代码语言:javascript
运行
复制
    configurations.releaseRuntimeClasspath.allDependencies.each {
        // …
    }

以下是一个误解:

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

您的应用程序确实不必担心这种“私有依赖”,但它仍然必须(能够)在运行时将其提供给库--因为库没有它就无法工作,因为它仍然是库的依赖。

我已经用一个小型的虚拟Android项目成功地测试了这个变化。如果您无法使用上述信息,请告诉我您的构建;然后,我可以在我的回答中添加一个独立的工作样例项目。

尽管如此,我不知道您为什么手动(a)指定已发布的工件和(b)创建POM?以下内容应自动工作(如上文所述经过测试):

代码语言:javascript
运行
复制
    release(MavenPublication) {
        groupId 'com.myapplication'
        artifactId 'library'
        version '1.0.3'

        from components.release
    }

另见医生们

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69424629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档