我有一个仅包含 Selenium/TestNG 测试类的 gradle 项目。它们是针对已部署的 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'.
我不确定如何解决这个问题,不用说,到目前为止还没有在网上找到答案。任何指示表示赞赏。
最佳答案
正如错误所示,问题出在 buildUtil
任务中。 buildUtil
声明了一个 compile
闭包,但默认任务不存在这样的闭包。
让我尝试澄清一下您的设置是什么。 util.TestGroupScanner
源位于 src/test/java/util
目录中,您希望将其与其他源(大概是 src/main/java
和 src/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
设置。
关于gradle - 如何在主项目之外的gradle中编译单个类依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10906278/