创建一个 Groovy 可执行 jar,其中包含要执行的 Spock 测试集
Create a Groovy executable jar with Spock test set as to be executed
我想用两个 groovy 文件创建 jar,AppLogic.groovy 其中包含两个少数 groovy classes 和另一个文件,AppSpec 有 Spock 测试套件我想执行这个 Spock class(设置为可执行文件)。如何创建具有所有依赖项的此类 jar?我在这里找到了与 jUnit 类似的东西:how to export (JUnit) test suite as executable jar 但无法根据我的需要进行调整。
我使用 gradle 进行构建,这是我的 build.gradle 文件:
group 'someGroup'
version '1.0'
apply plugin: 'groovy'
apply plugin: 'java'
apply plugin:'application'
sourceCompatibility = 1.7
repositories {
//some repos here
maven { url "http://repo.maven.apache.org/maven2" }
}
dependencies {
//some dependencies here
}
我四处浏览并找到了 SpockRuntime,但我不知道是否以及如何使用它来实现我的目标。
获胜者是:
static void main(String[] args) {
EmbeddedSpecRunner embeddedSpecRunner = new EmbeddedSpecRunner()
embeddedSpecRunner.runClass(MySpec)
}
我不建议按照接受的答案中所述使用 spock 实现中的 EmbeddedSpecRunner。
这是我发现与 gradle 4.9 一起可靠工作的东西。基本方法是使用:
- gradle 应用程序插件创建单个 tar 文件,其中包含所有 testRuntimeClasspath 依赖项和 运行 spock 测试 运行 脚本
- gradle maven-publish 插件将 tar 文件作为工件发布到您的 maven 存储库(在我的例子中是 nexus)
build.gradle 文件如下所示:
apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'maven-publish'
apply plugin: 'application'
mainClassName = 'org.junit.runner.JUnitCore' // The junit 4 test runner class
applicationName = 'run-tests-cli' // Feel free to change
repositories {
...
}
dependencies {
...
testImplementation "org.codehaus.groovy:groovy-all:${groovyVersion}"
testImplementation "org.spockframework:spock-core:${spockVersion}"
}
// Package compiled spock / junit tests to <artifact>-test-<version>.jar
task testJar(type: Jar) {
classifier = 'tests'
from sourceSets.test.output.classesDirs
}
// Copy all testRuntimeClasspath dependencies to libs folder
task copyToLibs(type: Copy) {
from configurations.testRuntimeClasspath
into "$buildDir/libs"
}
// Make sure test jar is copied
copyToLibs.dependsOn('testJar')
// Make sure platform-specific shell scripts are created after copyToLibs
startScripts.dependsOn(copyToLibs)
// Configure what goes into the tar / zip distribution file created by gradle distribution plugin assembleDist task
distributions {
main {
contents {
// Include test jar
from(testJar) {
into "lib"
}
// Include all dependencies from testRuntimeClasspath
from(copyToLibs) {
into "lib"
}
}
}
}
startScripts {
// Ensure ethat all testRuntimeClasspath dependencies are in classpath used by shell scripts
classpath = project.tasks['testJar'].outputs.files + project.configurations.testRuntimeClasspath
}
publishing {
repositories {
maven {
def releasesRepoUrl = "https://nexus.yourcompany.com/repository/maven-releases/"
def snapshotsRepoUrl = "https://nexus.yourcompany.com/repository/maven-snapshots/"
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
credentials {
username = rootProject.getProperty('NEXUS_USERNAME')
password = rootProject.getProperty('NEXUS_PASSWORD')
}
}
}
publications {
maven(MavenPublication) {
groupId = 'com.yourgroupId'
version = "${rootProject.getVersion()}"
}
TestJar(MavenPublication) {
artifact(testJar)
}
RunTestsCliTar(MavenPublication) {
artifact(distTar)
artifactId "${applicationName}"
}
}
}
现在您可以执行以下操作:
- 要在没有 运行ning 测试任务的情况下构建项目(包括 tar 文件):
gradle -x test clean build
- 发布项目产生的工件(包括 tar 文件到 maven 仓库——在我的例子中是 nexus):
gradlew -x test publish
。请注意,您需要提供凭据才能将工件上传到存储库。最好在 ~/.gradle/gradle.properties 中定义它们(在我的示例中为 NEXUS_USERNAME、NEXUS_PASSWORD)或通过 gradle 命令行上的 -P 选项指定它们.
我想用两个 groovy 文件创建 jar,AppLogic.groovy 其中包含两个少数 groovy classes 和另一个文件,AppSpec 有 Spock 测试套件我想执行这个 Spock class(设置为可执行文件)。如何创建具有所有依赖项的此类 jar?我在这里找到了与 jUnit 类似的东西:how to export (JUnit) test suite as executable jar 但无法根据我的需要进行调整。
我使用 gradle 进行构建,这是我的 build.gradle 文件:
group 'someGroup'
version '1.0'
apply plugin: 'groovy'
apply plugin: 'java'
apply plugin:'application'
sourceCompatibility = 1.7
repositories {
//some repos here
maven { url "http://repo.maven.apache.org/maven2" }
}
dependencies {
//some dependencies here
}
我四处浏览并找到了 SpockRuntime,但我不知道是否以及如何使用它来实现我的目标。
获胜者是:
static void main(String[] args) {
EmbeddedSpecRunner embeddedSpecRunner = new EmbeddedSpecRunner()
embeddedSpecRunner.runClass(MySpec)
}
我不建议按照接受的答案中所述使用 spock 实现中的 EmbeddedSpecRunner。
这是我发现与 gradle 4.9 一起可靠工作的东西。基本方法是使用:
- gradle 应用程序插件创建单个 tar 文件,其中包含所有 testRuntimeClasspath 依赖项和 运行 spock 测试 运行 脚本
- gradle maven-publish 插件将 tar 文件作为工件发布到您的 maven 存储库(在我的例子中是 nexus)
build.gradle 文件如下所示:
apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'maven-publish'
apply plugin: 'application'
mainClassName = 'org.junit.runner.JUnitCore' // The junit 4 test runner class
applicationName = 'run-tests-cli' // Feel free to change
repositories {
...
}
dependencies {
...
testImplementation "org.codehaus.groovy:groovy-all:${groovyVersion}"
testImplementation "org.spockframework:spock-core:${spockVersion}"
}
// Package compiled spock / junit tests to <artifact>-test-<version>.jar
task testJar(type: Jar) {
classifier = 'tests'
from sourceSets.test.output.classesDirs
}
// Copy all testRuntimeClasspath dependencies to libs folder
task copyToLibs(type: Copy) {
from configurations.testRuntimeClasspath
into "$buildDir/libs"
}
// Make sure test jar is copied
copyToLibs.dependsOn('testJar')
// Make sure platform-specific shell scripts are created after copyToLibs
startScripts.dependsOn(copyToLibs)
// Configure what goes into the tar / zip distribution file created by gradle distribution plugin assembleDist task
distributions {
main {
contents {
// Include test jar
from(testJar) {
into "lib"
}
// Include all dependencies from testRuntimeClasspath
from(copyToLibs) {
into "lib"
}
}
}
}
startScripts {
// Ensure ethat all testRuntimeClasspath dependencies are in classpath used by shell scripts
classpath = project.tasks['testJar'].outputs.files + project.configurations.testRuntimeClasspath
}
publishing {
repositories {
maven {
def releasesRepoUrl = "https://nexus.yourcompany.com/repository/maven-releases/"
def snapshotsRepoUrl = "https://nexus.yourcompany.com/repository/maven-snapshots/"
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
credentials {
username = rootProject.getProperty('NEXUS_USERNAME')
password = rootProject.getProperty('NEXUS_PASSWORD')
}
}
}
publications {
maven(MavenPublication) {
groupId = 'com.yourgroupId'
version = "${rootProject.getVersion()}"
}
TestJar(MavenPublication) {
artifact(testJar)
}
RunTestsCliTar(MavenPublication) {
artifact(distTar)
artifactId "${applicationName}"
}
}
}
现在您可以执行以下操作:
- 要在没有 运行ning 测试任务的情况下构建项目(包括 tar 文件):
gradle -x test clean build
- 发布项目产生的工件(包括 tar 文件到 maven 仓库——在我的例子中是 nexus):
gradlew -x test publish
。请注意,您需要提供凭据才能将工件上传到存储库。最好在 ~/.gradle/gradle.properties 中定义它们(在我的示例中为 NEXUS_USERNAME、NEXUS_PASSWORD)或通过 gradle 命令行上的 -P 选项指定它们.