【问题标题】:Use an aar library cause missing dependencies using api in Gradle 4.x在 Gradle 4.x 中使用 aar 库导致缺少使用 api 的依赖项
【发布时间】:2018-03-19 01:31:58
【问题描述】:

当我使用 *.aar 文件而不是使用 Gradle 4.x 的模块并遵循关于 implementsapidocu 构建应用程序时,我希望使用 api 包含的 aar 文件包含所有依赖项,但它没有。

当你这样做时

git clone https://github.com/hannesa2/aar_dependency
./gradlew clean assembleDebug

表示

dependencies {
    api project(':mylibrary')

它工作正常。

但是当我使用 lib-module 的 insted 之前生成的 *.aar 文件作为依赖项时

 dependencies {
    api 'com.example.my.mylibrary:mylibrary-debug@aar'

(在demo app 中)

git checkout with_aar
./gradlew clean assembleDebug

我遇到了这个

任务 :app:transformClassesWithDesugarForDebug 线程“main”中的异常 java.lang.TypeNotPresentException:类型 io.reactivex.ObservableTransformer 不存在 在 sun.invoke.util.BytecodeDescriptor.parseSig(BytecodeDescriptor.java:85) 在 sun.invoke.util.BytecodeDescriptor.parseMethod(BytecodeDescriptor.java:63) 在 sun.invoke.util.BytecodeDescriptor.parseMethod(BytecodeDescriptor.java:41) 在 java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:1067) 在 com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:399) 在 org.objectweb.asm.MethodVisitor.visitInvokeDynamicInsn(未知来源) 在 org.objectweb.asm.MethodVisitor.visitInvokeDynamicInsn(未知来源)

因为我通常在将 aar 工件上传到我们公司的 Maven Nexus 时遇到这种情况,所以我创建了这个 demo-repo 来准确显示问题所在。在演示应用程序或使用 Maven 中,我看到了同样的问题。

有人知道我做错了吗?

【问题讨论】:

  • aar 文件不包含传递依赖。将其发布到 maven 存储库中
  • 我的 aar 使用例如。 RxJava,这个 RxJava 已经在另一个 maven 中了。所以我猜你的建议“在 maven repo 中发布”已经实现,还是我错了? aar 消费者有没有办法在不处理 RxJava 依赖项的情况下使用它?

标签: android module android-gradle-plugin aar


【解决方案1】:

我能够解决它。主要问题是使用 api

的带有 Gradle 4.x 的 Android O
dependencies {
    api 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    api "io.reactivex.rxjava2:rxandroid:$versions.libs.rxAndroid"

大多数答案都与这样的事情有关

publishing {
    publications {
        mipartner(MavenPublication) {
            groupId '...'
            artifactId '..'
            version 1.0
            artifact "$buildDir/outputs/aar/myLib-release.aar"

            //generate pom nodes for dependencies
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.compile.allDependencies.each { dependency ->
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dependency.group)
                    dependencyNode.appendNode('artifactId', dependency.name)
                    dependencyNode.appendNode('version', dependency.version)
                }
            }
        }
    }

    repositories{
        maven {
            url "https://some.url.com"
        }
    }
}

但是在生成的 *.pom 中没有包含依赖项,在将此行更改为 api 后,依赖项包含在部署的 pom 中!

configurations.api.allDependencies.each { dependency ->

在此之后您可以轻松使用 aar 文件

dependencies {
    api "com.mylib.net:mylib:1.0"

【讨论】:

  • 我的理解是,api "com.mylib.net:mylib:1.0" 使用已发布的jar 文件,但api "com.mylib.net:mylib:1.0@aar" 使用已发布的aar 文件。使用aar 我必须添加transitive = true 才能使其工作,使用jar 它就像你的情况一样。我想知道,如果您仅将 api 依赖项添加到 pom 文件中,您不会因为缺少 implementation 依赖项而出现运行时错误吗?
猜你喜欢
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 2015-05-03
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
相关资源
最近更新 更多