如何在主项目之外的gradle中编译单类依赖项

如何在主项目之外的gradle中编译单类依赖项,gradle,Gradle,我有一个gradle项目,它只包含Selenium/TestNG测试类。它们针对已部署的war应用程序执行。一切正常,现在我添加了一个java实用程序,它将查询测试库并打印属于给定TestNG组的测试列表。该实用程序应该与主项目分开编译和执行,因为用户可能希望在测试执行之前查询测试库 我在build.gradle中添加了以下内容: task listgroups(dependsOn:'buildUtil' ) <<{ ant.java(classname: 'util.Tes

我有一个gradle项目,它只包含Selenium/TestNG测试类。它们针对已部署的war应用程序执行。一切正常,现在我添加了一个java实用程序,它将查询测试库并打印属于给定TestNG组的测试列表。该实用程序应该与主项目分开编译和执行,因为用户可能希望在测试执行之前查询测试库

我在build.gradle中添加了以下内容:

task listgroups(dependsOn:'buildUtil' ) <<{
    ant.java(classname: 'util.TestGroupScanner', fork: true,
            classpath: "src/test/java")
}

task buildUtil {
    compile {
        source = "src/test/java/util"
    }
}

我不知道如何解决这个问题,不用说,到目前为止还没有在网上找到答案。任何指针都值得赞赏。

正如错误所示,问题出在
buildUtil
任务中。
buildUtil
声明了一个
compile
闭包,但是默认任务不存在这样的闭包

让我试着澄清一下你的设置是什么。
util.TestGroupScanner
源代码位于
src/test/java/util
目录中,您希望将其与其他源代码分开编译(可能是
src/main/java
src/test/java
)。
buildUtil
任务应该编译
src/test/java/util
中的源代码,
listgroups
任务在sources
src/test/java
文件夹上执行scanner实用程序

在这种情况下,我建议您为您的实用程序源声明一个新版本,如下所示:

sourceSets {
  util {
    java {
       srcDir 'src/test/java/util'
    }
  }
}
这将自动为您创建一个名为
compileUtilJava
的编译任务,该任务将编译这些源代码。我还认为,在执行工具时,应该在类路径中包含实用程序类,可以通过
sourceset.util.output.classesDir
检索这些类。因此,现在您的
列表组
任务将如下所示:

task listgroups(dependsOn: 'compileUtilJava' ) <<{
  ant.java(classname: 'util.TestGroupScanner', fork: true,
           classpath: "src/test/java:" + sourceSets.util.output.classesDir)
}

task listgroups(dependsOn:'compileUtilJava')要用gradle解决这个问题,我建议为您的util类创建一个特定的源集,并添加一个JavaExec类型的任务,它执行这个类来打印您的testng组。请查看以下代码段:

apply plugin:'java'
...
...
configurations{
    testUtilCompile.extendsFrom testCompile 
}

...
...
sourceSets{
    testUtil{
        java {
            srcDir "src/test/java"
            include "util/**"
        }
    }
}

task printGroups(type:JavaExec){
    main = "util.TestGroupScanner"
    classpath = sourceSets.testUtil.runtimeClasspath
}
问候,,
勒内

谢谢你!很有魅力。谢谢你提供的细节。我现在对gradle的工作有了更好的了解。。。您是对的,我需要将util移出test/java目录结构。谢谢你指出这一点。我将您的sourceSet定义与另一个响应中的JavaExec组合在一起,它可以正常工作。
apply plugin:'java'
...
...
configurations{
    testUtilCompile.extendsFrom testCompile 
}

...
...
sourceSets{
    testUtil{
        java {
            srcDir "src/test/java"
            include "util/**"
        }
    }
}

task printGroups(type:JavaExec){
    main = "util.TestGroupScanner"
    classpath = sourceSets.testUtil.runtimeClasspath
}