如何添加一个新的源码到Gradle?

我想添加集成testing到我的Gradle版本(版本1.0)。 它们应该与我的正常testing分开运行,因为它们需要将Web应用程序部署到本地主机(他们testing该Web应用程序)。 testing应该能够使用我的主要源集中定义的类。 我如何做到这一点?

这花了我一段时间才弄清楚,网上资源并不好。 所以我想logging我的解决scheme。

这是一个简单的gradle构build脚本,除了主要和testing源集之外,还有一个intTest源集:

apply plugin: "java" sourceSets { // Note that just declaring this sourceset creates two configurations. intTest { java { compileClasspath += main.output runtimeClasspath += main.output } } } configurations { intTestCompile.extendsFrom testCompile intTestRuntime.extendsFrom testRuntime } task intTest(type:Test){ description = "Run integration tests (located in src/intTest/...)." testClassesDir = project.sourceSets.intTest.output.classesDir classpath = project.sourceSets.intTest.runtimeClasspath } 

以下是我如何在不使用configurations{ }情况下实现此目的。

 apply plugin: 'java' sourceCompatibility = JavaVersion.VERSION_1_6 sourceSets { integrationTest { java { srcDir 'src/integrationtest/java' } resources { srcDir 'src/integrationtest/resources' } compileClasspath += sourceSets.main.runtimeClasspath } } task integrationTest(type: Test) { description = "Runs Integration Tests" testClassesDir = sourceSets.integrationTest.output.classesDir classpath += sourceSets.integrationTest.runtimeClasspath } 

testing使用: Gradle 1.4和Gradle 1.6

总结两个旧的答案(两个世界的最佳和最小的可行性):

先有些温暖的话:

  1. 首先,我们需要定义sourceSet:

     sourceSets {
         integrationTest
     }
    
  2. 接下来我们展开来自testing的sourceSet,因此我们使用testingruntimeClasspath(其中包括来自testingANDtesting本身的所有代码)作为派生sourceSet的类path

     sourceSets {
         integrationTest {
             compileClasspath + = sourceSets.test.runtimeClasspath
             runtimeClasspath + = sourceSets.test.runtimeClasspath // ***)
         }
     }
    
    • ***注)不知何故这种重新声明/扩展为sourceSets.integrationTest.runtimeClasspath是必要的,但应该是不相关的,因为runtimeClasspath总是展开output + runtimeSourceSet ,不明白
  3. 我们为运行集成testing定义一个专门的任务

    任务集成testing(types:testing){
     }
    
  4. 告诉testing作业应该使用哪些testing类和classPaths,而不是来自“test”sourceset的默认值

    任务集成testing(types:testing){
         testClassesDir = sourceSets.integrationTest.output.classesDir
         classpath = sourceSets.integrationTest.runtimeClasspath
     }
    
  5. (可选) testing后自动运行

     integrationTest.depends进行testing
    
  6. (可选)自动运行检查

     check.depends在integrationTest上
    
  7. (可选)将java资源添加到sourceSet以允许自动检测并在您的IDE中创build这些“partials”。 如果IntelliJ IDEA不存在,IntelliJ IDEA将自动为每个集合创buildsourceSet目录java和资源

     sourceSets {
          integrationTest {
              java的
             资源
          }
     }
    

TL;博士

 apply plugin: 'java' // apply the runtimeClasspath from "test" sourceSet to the new one // to include any needed assets: test, main, test-dependencies and main-dependencies sourceSets { integrationTest { // not necessary but nice for IDEa's java resources compileClasspath += sourceSets.test.runtimeClasspath // somehow this redeclaration is needed, but should be irrelevant // since runtimeClasspath always expands compileClasspath runtimeClasspath += sourceSets.test.runtimeClasspath } } // define custom test task for running integration tests task integrationTest(type: Test) { testClassesDir = sourceSets.integrationTest.output.classesDir classpath = sourceSets.integrationTest.runtimeClasspath } integrationTest.dependsOn test 

指的是:

  • gradle java章节45.7.1。 源集属性
  • gradle java章节45.7.3。 一些源码集的例子

不幸的是, github.com /gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/ build.gradle或… / gradle / … / withIntegrationTests / build.gradle上的示例代码似乎不处理这个或有一个不同的/更复杂/对我来说没有更清晰的解决scheme!

星云方面的插件消除了样板:

 apply plugin: 'nebula.facet' facets { integrationTest { parentSourceSet = 'test' } } 

对于集成testing具体来说,即使这样做 ,只要适用:

 apply plugin: 'nebula.integtest' 

每个Gradle插件门户链接是:

  1. nebula.facet
  2. nebula.integtest

从Gradle 4.0开始,这对我来说很有用。

 sourceSets { integrationTest { compileClasspath += sourceSets.test.compileClasspath runtimeClasspath += sourceSets.test.runtimeClasspath } } task integrationTest(type: Test) { description = "Runs the integration tests." group = 'verification' testClassesDirs = sourceSets.integrationTest.output.classesDirs classpath = sourceSets.integrationTest.runtimeClasspath } 

从版本4.0开始,Gradle现在为源集中的每种语言使用单独的类目录。 因此,如果您的构build脚本使用sourceSets.integrationTest.output.classesDir ,则会看到以下弃用警告。

Gradle现在为每个JVM语言使用单独的输出目录,但是这个版本假设源集合中所有类的单个目录。 这个行为已经被弃用,并计划在Gradle5.0中被删除

为了摆脱这个警告,只需切换到sourceSets.integrationTest.output.classesDirs 。 有关更多信息,请参阅Gradle 4.0发行说明 。