【问题标题】:Jacoco fails on Gradle 7.0.2 and Kotlin 1.5.10Jacoco 在 Gradle 7.0.2 和 Kotlin 1.5.10 上失败
【发布时间】:2021-05-27 15:28:32
【问题描述】:

今天我更新了android studio中的gradle和kotlin依赖。

新版本如下:

kotlin_version = "1.5.10"
...
jacoco {
    toolVersion = "0.8.6"
}
...
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip

测试覆盖率报告任务失败并出现以下错误:

2021-05-27T16:57:49.150+0200 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter] Executing actions for task ':consumerkit:testDebugUnitTestCoverage'.
2021-05-27T16:57:49.304+0200 [DEBUG] [org.codehaus.groovy.vmplugin.VMPluginFactory] Trying to create VM plugin `org.codehaus.groovy.vmplugin.v9.Java9` by checking `java.lang.Module`, but failed:
java.lang.ClassNotFoundException: java.lang.Module
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at org.codehaus.groovy.vmplugin.VMPluginFactory.lambda$createPlugin$0(VMPluginFactory.java:61)
        at java.security.AccessController.doPrivileged(Native Method)

【问题讨论】:

  • 为什么你认为这和JaCoCo有关?堆栈跟踪似乎与 Groovy 有关。无论如何,对于 Kotlin 1.5,您应该使用 JaCoCo 0.8.7 而不是 0.8.6 - 请参阅 github.com/jacoco/jacoco/pull/1164 那么您能试试吗?
  • @Godin 我包括了 jacoco,因为当它应该生成报告时任务失败了。是的,新更新可以正常工作(您可以将其发布为答案)。谢谢

标签: android android-studio kotlin gradle jacoco


【解决方案1】:

对于 Kotlin 1.5,您应该使用 JaCoCo 0.8.7 而不是 0.8.6 - 请参阅 https://github.com/jacoco/jacoco/pull/1164https://www.jacoco.org/jacoco/trunk/doc/changes.html 的完整变更日志

示例 sn-p:

// build.gradle or build.gradle.kts
jacoco {
    toolVersion = "0.8.7"
}

【讨论】:

    【解决方案2】:

    我已经有了

    jacoco {
        toolVersion = "0.8.7"
    }
    

    已配置但仍无法正常工作,解决此问题的方法是关注此评论 here

    1. 在您的模块build.gradle 中切换回:
    android {
        //....
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    
        kotlinOptions {
            jvmTarget = "1.8"
        }
    }
    

    不用担心,如果您还没有使用 Java 11 语言功能,它不会破坏任何东西,AGP 7 仍然与 JDK 8 作为目标兼容。

    1. 然后你需要强制 AGP 使用 0.8.7 版本而不是默认的 0.8.3 版本。在根 build.gradle 文件的 allprojects 块中,添加以下内容:
    allprojects {
      //... other things
    
      // workaround to fix an auto-import of a lower Jacoco version
      resolutionStrategy {
        eachDependency { details ->
          if ('org.jacoco' == details.requested.group) {
            details.useVersion "0.8.7"
          }
        }
      }
    }
    

    现在它应该可以使用:

    AGP 7.0.X
    Kotlin 1.5.X
    JDK 11 (embedded with AS)
    

    【讨论】:

    • 这个答案对我有帮助。因此,当我将源版本和目标版本升级到 11 时,我收到此错误 PBI: {"kind":"error","text":"com.android.tools.r8.internal.r8: Unsupported dynamic constant: $jacocoData : Ljava /lang/Object; com/rules/Range.$jacocoInit 任何想法。
    【解决方案3】:

    只是做

    jacoco {
        toolVersion = "0.8.7"
    }
    

    对我来说还不够。我还必须覆盖 Android 使用的版本,以便 androidJacocoAnt 依赖项也使用 0.8.7。 (./gradlew app:dependencies) 只需将此添加到您的 gradle 中

    android.jacoco.version = "0.8.7"
    

    【讨论】:

      【解决方案4】:

      这是一个相当老的线程,但是这些解决方案并没有完全解决我在 Android 项目中的问题(实际上是用 Java 编写的 - 不是用 Kotlin 编写的),所以我将在这里添加我的解决方案。也许有人会觉得它有帮助。

      除了将 jacoco toolVersion 更新为 0.8.7,我还必须更新我的 jacoco 配置中的执行数据,如下所示:

      project.afterEvaluate {
        tasks.create(name: "${unitTestTask}Coverage", type: JacocoReport, 
        dependsOn: [
          "$unitTestTask",
          ":sdk:testDebugUnitTest",
          ":sdk:connectedCheck"
        ]) {
      
         /* all jacoco custom configuration goes here... */
      
          executionData(fileTree(dir: "$buildDir", includes: [
            "jacoco/testDebugUnitTest.exec",        
            "outputs/unit_test_code_coverage/debugUnitTest/testDebugUnitTest.exec",
            "outputs/code_coverage/debugAndroidTest/connected/*coverage.ec"
          ]))
        }
      }
      

      在此配置中,我必须添加以下行:

      "outputs/unit_test_code_coverage/debugUnitTest/testDebugUnitTest.exec"
      

      之前不存在,因为声纳使用的生成报告的文件是在新位置生成的。使用 gradle 任务testDebugUnitTestCoverage 生成报告。毕竟,我能够通过声纳生成测试覆盖率报告,包括连接/仪器 Android 测试和 Java 中的常规单元测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 2021-05-08
        • 1970-01-01
        • 1970-01-01
        • 2017-01-14
        • 1970-01-01
        相关资源
        最近更新 更多