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

时间:2012-06-05 23:16:25

标签: gradle

我有一个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"
    }
}

但是,在调用listgroups任务时,我收到以下错误:

C:\console-bg1>g listgroups

FAILURE: Build failed with an exception.
(...)

* What went wrong:
A problem occurred evaluating root project 'console-bg1'.
> Could not find method compile() for arguments [build_4emu7duna2isgubc1k8uts8k9
8$_run_closure6_closure11@d210ab] on root project 'console-bg1'.

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

2 个答案:

答案 0 :(得分:2)

问题出在buildUtil任务中,正如错误所示。 buildUtil声明compile闭包,但默认任务不存在此类闭包。

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

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

sourceSets {
  util {
    java {
       srcDir 'src/test/java/util'
    }
  }
}

这将自动为您创建一个名为compileUtilJava的编译任务,它将编译这些源。我还认为您在执行工具时需要在类路径中包含实用程序类,可以由sourceSets.util.output.classesDir检索。所以现在你的listgroups任务看起来像是:

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

我注意到有关您的设置的一件事是,src/test/java/util源文件夹嵌套在src/test/java下。 Gradle会假定src/test/java是项目测试的默认文件夹,因此会在运行测试时自动包含它及其所有子项。由于您希望将实用程序文件夹与默认设置分开,我建议您将其放在src/testutil/java中,以避免任何冲突。如果您这样做,请不要忘记使用正确的源路径更新上面的sourceSets设置。

答案 1 :(得分:0)

要使用gradle解决此问题,我建议为您的util类创建一个特定的sourceset,并添加一个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
}

的问候, 勒