我想编写一个自定义插件,它应该定义自己的测试任务。此任务应具有常见测试任务的属性,但需要执行一些额外的操作。
我的任务类看起来像这样:
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
答案 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 )
}