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

标签 gradle

我有一个仅包含 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/

相关文章:

java - 如何在heroku部署上显示gradle stacktrace?

Gradle 不使用 Maven 本地存储库来创建新的依赖项

Android Studio Gradle 同步失败 : CreateProcess error=193, %1 不是有效的 Win32 应用程序

java - Controller 中的字段需要名为 'entityManagerFactory' 的 bean,但无法找到

java - 在 gradle 中完成任务后添加消息或下一行

git - git describe --match在TeamCity上不起作用

spring-boot - Gradle bootRun 从多模块项目中的父文件夹

eclipse - 使用 Gradle+Eclipse 在 Jetty 上启用热部署的最佳方式

java - 无法使用转换 IdentityTransform 转换文件 'pp-release.aar' 以匹配属性 {artifactType=processed-aar}

Android 谷歌服务插件版本冲突