自定义Gradle Java插件在v5.2.1中崩溃,但在v4.7中工作?

自定义Gradle Java插件在v5.2.1中崩溃,但在v4.7中工作?,java,gradle,gradle-plugin,Java,Gradle,Gradle Plugin,我的插件在Gradle v4.7中工作,但现在正在崩溃v5.2.1。我知道这是一个巨大的版本跳跃 我编写了一个定制的GradleJava插件,这是插件实现类。我在task.setProject(project)调用中放置了一个断点,但它从未到达那里 package com.zift.utilities; import org.gradle.api.Plugin; import org.gradle.api.Project; public class ZiftVersionPlugin imp

我的插件在Gradle v4.7中工作,但现在正在崩溃v5.2.1。我知道这是一个巨大的版本跳跃

我编写了一个定制的GradleJava插件,这是插件实现类。我在
task.setProject(project)
调用中放置了一个断点,但它从未到达那里

package com.zift.utilities;

import org.gradle.api.Plugin;
import org.gradle.api.Project;

public class ZiftVersionPlugin implements Plugin<Project> {
    public void apply(Project project) {
        project.getTasks().create("manageVersion", ZiftVersion.class, (task) -> {
            // Added breakpoint here, but it's never reached!
            task.setProject(project);
        });
    }
}
这是我的项目的
build.gradle
文件,用于构建插件

plugins {
  id 'idea'
  id 'java'
  id 'maven'
  id 'maven-publish'
  id 'java-gradle-plugin'
}

group=project.groupId
version = '666.666.666'

dependencies {
  compile gradleApi()
}

jar {
  manifest {
    attributes 'artifactId': 'zift-version-plugin',
               'groupId': 'com.zift.utilities',
               'version': project.version
  }
  baseName artifactId
  doLast {
    println "artifactId: $project.artifactId\ngroupId: $project.groupId\nversion: $version"
  }
}

gradlePlugin {
    plugins {
        simplePlugin {
            id = 'com.zift.utilities.zift-version-plugin'
            implementationClass = 'com.zift.utilities.ZiftVersionPlugin'
        }
    }
}
$ ./gradlew manageVersion --srcBranch=feature/devops-507-semver-support --dstBranch=master
> Task :manageVersion
Hello world!
下面是我如何使用它,来自另一个使用该插件的Gradle项目

plugins {
  id 'idea'
  id 'java'
  id 'maven'
  id 'maven-publish'
  id 'java-gradle-plugin'
}

group=project.groupId
version = '666.666.666'

dependencies {
  compile gradleApi()
}

jar {
  manifest {
    attributes 'artifactId': 'zift-version-plugin',
               'groupId': 'com.zift.utilities',
               'version': project.version
  }
  baseName artifactId
  doLast {
    println "artifactId: $project.artifactId\ngroupId: $project.groupId\nversion: $version"
  }
}

gradlePlugin {
    plugins {
        simplePlugin {
            id = 'com.zift.utilities.zift-version-plugin'
            implementationClass = 'com.zift.utilities.ZiftVersionPlugin'
        }
    }
}
$ ./gradlew manageVersion --srcBranch=feature/devops-507-semver-support --dstBranch=master
> Task :manageVersion
Hello world!
下面是一个示例,看起来它发生在
create()
函数调用期间

Caused by org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreationException: Could not create task ':manageVersion'
Caused by java.lang.NullPointerException:  (No message provided)
at org.gradle.api.internal.tasks.TaskPropertyUtils.visitProperties(TaskPropertyUtils.java:38)
at org.gradle.api.internal.project.taskfactory.PropertyAssociationTaskFactory.create(PropertyAssociationTaskFactory.java:49)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory.create(AnnotationProcessingTaskFactory.java:46)
...
at org.gradle.api.internal.tasks.DefaultTaskContainer.create(DefaultTaskContainer.java:359)
at com.zift.utilities.ZiftVersionPlugin.apply(ZiftVersionPlugin.java:8)

有什么线索吗?

白痴是原因,尤其是我的白痴

我使用来自v4.x的Gradle包装器编译了我的插件,因此当使用v5.x或更高版本构建的项目使用它时,插件崩溃


解决方案是将我的插件包装器升级到GradleV6.0,构建并发布一个新版本,让项目使用新版本。不再发生崩溃。

由于使用了调试器,您应该在
TaskPropertyUtils.visitProperties()
中设置一个断点,并调查发生异常时哪个值为null。@tkruse,我在那里设置了一个断点,它似乎在这个循环中出错了。在那之后,我迷失在Java代码中<(对象路径:((TaskDestroyablesInternal)task.getDestroyables()).GetRegisteredPath()){visitor.VisitdDestroyableProperty(新的DefaultTaskDestroyablePropertySpec(“$”+++destroyableCount,path));}不确定是否有其他人可以在没有代码的情况下帮助调试问题。@tkruse,我添加了一个简化的任务代码的“Hello world”版本。当使用Gradle v4.7尝试您的插件代码时,我在
task.setProject(project);
:在
AbstractTask
上没有
project
属性的setter(请参阅):如何使此插件在Gradle 4.7中工作?