如何添加一个新的源码到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
总结两个旧的答案(两个世界的最佳和最小的可行性):
先有些温暖的话:
-
首先,我们需要定义sourceSet:
sourceSets { integrationTest }
-
接下来我们展开来自testing的sourceSet,因此我们使用testingruntimeClasspath(其中包括来自testingANDtesting本身的所有代码)作为派生sourceSet的类path
sourceSets { integrationTest { compileClasspath + = sourceSets.test.runtimeClasspath runtimeClasspath + = sourceSets.test.runtimeClasspath // ***) } }
- ***注)不知何故这种重新声明/扩展为sourceSets.integrationTest.runtimeClasspath是必要的,但应该是不相关的,因为runtimeClasspath总是展开
output + runtimeSourceSet
,不明白
- ***注)不知何故这种重新声明/扩展为sourceSets.integrationTest.runtimeClasspath是必要的,但应该是不相关的,因为runtimeClasspath总是展开
-
我们为运行集成testing定义一个专门的任务
任务集成testing(types:testing){ }
-
告诉testing作业应该使用哪些testing类和classPaths,而不是来自“test”sourceset的默认值
任务集成testing(types:testing){ testClassesDir = sourceSets.integrationTest.output.classesDir classpath = sourceSets.integrationTest.runtimeClasspath }
-
(可选) testing后自动运行
integrationTest.depends进行testing
-
(可选)自动运行检查
check.depends在integrationTest上
-
(可选)将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插件门户链接是:
- nebula.facet
- 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发行说明 。