编写从Test延伸的gradle任务

时间:2014-07-02 13:07:13

标签: groovy gradle

我想编写一个自定义插件,它应该定义自己的测试任务。此任务应具有常见测试任务的属性,但需要执行一些额外的操作。

我的任务类看起来像这样:

import org.gradle.api.tasks.TaskAction;
import org.gradle.api.tasks.testing.Test

class MyTestTask extends Test {

    @TaskAction
    def intTest() {
        dosomething()
    }
}

我应该创建此任务的插件类如下所示:

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

class JavaProjectPlugin implements Plugin<Project> {

    @Override
    public void apply(Project project) {
        project.plugins.apply('java')
        project.task('myTest', type: MyTestTask)

        doMoreStuff()
    }
}

但是当我尝试执行应用此插件的项目时,我收到此错误:

Caused by: java.lang.ClassNotFoundException: org.gradle.api.tasks.testing.TestFilter
    at java.net.URLClassLoader.findClass(URLClassLoader.java:588)
    at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:756)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:733)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:703)
    ... 232 more

我是否会遗漏某些内容,或者我是否必须完全不同?

使用gradle 1.9建立插件后,我得到了这个堆栈跟踪:

Caused by: java.lang.NoSuchMethodError: org/gradle/api/tasks/testing/Test.<init>()V
    at com.ibm.gradle.MyTestTask.<init>(MyTestTask.groovy)
    at com.ibm.gradle.MyTestTask_Decorated.<init>(Unknown Source)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:68)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:529)
    at org.gradle.api.internal.DependencyInjectingInstantiator.newInstance(DependencyInjectingInstantiator.java:62)
    at org.gradle.api.internal.ClassGeneratorBackedInstantiator.newInstance(ClassGeneratorBackedInstantiator.java:36)
    at org.gradle.api.internal.project.taskfactory.TaskFactory$1.call(TaskFactory.java:124)
    ... 218 more

3 个答案:

答案 0 :(得分:1)

请问您在运行时是否正在使用gradle 1.2? 您可以在gradle 1.12中生成插件,但在运行时使用较低版本

答案 1 :(得分:0)

这个NoSuchMethodError是由org / gradle / api / tasks / testing / Test的构造函数引起的。在gradle 0.8中添加了这个空构造函数(不带参数)。您的运行时gradle版本似乎是gradle 0.7或更早版本。见http://www.gradle.org/docs/0.7/javadoc/org/gradle/api/tasks/testing/Test.html

这意味着您必须为MyTestTask提供一个空构造函数,该构造函数调用Test构造函数:

Test(Project project, java.lang.String name) 

我强烈建议您在运行时推送更新的gradle版本。

答案 2 :(得分:0)

一般来说,Bill Lin的回答正确地解决了这个问题。就像我在评论中说的那样,它不是gradle 0.7,而是gradle 1.12。由于他们更改了Test类的构造函数,因此必须提供至少像这样的构造函数:

@Inject
public MyTestTask(ListenerManager listenerManager, StyledTextOutputFactory textOutputFactory, FileResolver fileResolver,
                Factory<WorkerProcessBuilder> processBuilderFactory, ActorFactory actorFactory, Instantiator instantiator,
                ProgressLoggerFactory progressLoggerFactory) {
    super(listenerManager, textOutputFactory, fileResolver, processBuilderFactory, actorFactory, instantiator, progressLoggerFactory )
}