带有 JacocoPluginExtension 的 NullPointerException

NullPointerException with JacocoPluginExtension

我是 运行 Azure DevOps 中的最新 gradle (6.8) 版本,我遇到了 NPE:

Caused by: java.lang.NullPointerException
    at org.gradle.testing.jacoco.plugins.JacocoPluginExtension.applyTo(JacocoPluginExtension.java:162)
    at org.gradle.testing.jacoco.plugins.JacocoPluginExtension$applyTo.call(Unknown Source)
    at org.akhikhl.gretty.StartBaseTask.initJacoco(StartBaseTask.groovy:156)
    at org.akhikhl.gretty.StartBaseTask.<init>(StartBaseTask.groovy:41)
    at org.akhikhl.gretty.AppStartTask.<init>(AppStartTask.groovy)
    at org.akhikhl.gretty.AppStartTask_Decorated.<init>(Unknown Source)

我在build.gradle中有这样的配置:

buildscript {
    repositories {
        mavenCentral()
    }
}

repositories {
    mavenCentral()
}

apply plugin: 'java'
apply plugin: 'jacoco'

group = '*****'
version = '1.0-SNAPSHOT'

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    // my deps
}

test {
    maxParallelForks = 1
    finalizedBy jacocoTestReport
}

jacocoTestReport {
    dependsOn test
}

jacoco {
    toolVersion = "0.8.6"
}

我在 Azure DevOps 管道中有这样的配置:

- task: Gradle@2
  displayName: 'Build and run unit tests'
  inputs:
    gradleWrapperFile: project-name/gradlew
    workingDirectory: project-name
    testResultsFiles: 'project-name/build/test-results/test/TEST-*.xml'
    sonarQubeRunAnalysis: true
    sonarQubeGradlePluginVersion: 2.6.2

知道为什么会这样吗?

NullPointerException with JacocoPluginExtension

如果repo中项目的文件夹中有一个“.gradle”文件夹。请尝试从存储库中删除 .gradle 文件夹,然后再次重建管道。

注意:做好备份,以防万一。

此外,如果以上建议不适合您,请尝试在没有 Azure devops 的情况下在您的本地构建它,以检查您是否仍然遇到此问题。

从堆栈跟踪可以看出,当 Gretty 插件尝试配置 JaCoCo 插件时会发生 NullPointerException。

Gradle 发展非常快,API 通常会在至少一个主要版本之后被弃用和删除(例如,在 5.0 中弃用并在 6.0 中删除)。 buildscript 和插件作者通常需要大约一到两年的时间来对这些弃用做出反应。

虽然你没有提到,但我很确定你使用的是三年多前的版本 original Gretty plugin:

至少我可以使用该版本重现问题和相同的堆栈跟踪。

虽然它看起来像几年前就被遗弃了,但事实并非如此。相反,该插件已分叉 moved to a new namespace(从 org.akhikhl.grettyorg.gretty):

甚至还有一个 bug report 描述了 NullPointerException 问题(一直追溯到 Gradle 4.6)。

因此,要修复它,请将 Gretty 插件 ID 更改为新的命名空间并使用最新版本:

plugins {
  id "org.gretty" version "3.0.3"
}