构建并运行Spock Groovy脚本可执行Jar包的问题排查
问题分析与解决方案
首先你犯了一个基础错误:把生成的Jar文件路径当成Gradle任务名来执行了,Gradle命令行参数只能是任务名称,不能直接写文件路径。下面是正确的构建和运行步骤:
一、正确构建可执行Shadow Jar
Shadow插件提供的Uber-Jar构建任务是shadowJar,不是默认的jar任务(默认jar只打包当前模块的编译代码,不包含依赖)。
构建命令
- 在项目根目录执行:
(./gradlew :common-config-qa:shadowJar:common-config-qa:是模块路径,指定Gradle执行该模块的shadowJar任务) - 或者进入
common-config-qa模块目录执行:./gradlew shadowJar
二、调整Shadow Jar配置以支持测试执行
你当前的配置有问题:mainClass设置为CommonSpockSpec是错误的,Spock测试类不能直接作为可执行Jar的主类,需要用Spock官方提供的运行器类来触发测试执行。
修改common-config-qa/build.gradle.kts配置如下:
plugins { id("groovy") id("java") id("com.github.johnrengelman.shadow") version "7.1.2" } dependencies { // 确保引入Spock及相关测试依赖(根据你的实际版本调整) testImplementation("org.spockframework:spock-core:2.3-groovy-4.0") testImplementation("org.codehaus.groovy:groovy-all:4.0.11") // 你的其他依赖(比如Java工具类的依赖) } tasks.shadowJar { // 打包测试代码和测试运行时依赖 from(sourceSets.test.get().output) configurations = listOf(project.configurations.testRuntimeClasspath.get()) // 设置主类为Spock的官方运行器 manifest { attributes(mapOf( "Main-Class" to "org.spockframework.runner.SpockMain", "Implementation-Title" to project.name, "Implementation-Version" to project.version )) } }
这个配置会把模块内的测试代码、Java工具类,以及所有测试运行所需的依赖(包括Spock、Groovy等)全部打包进Uber-Jar。
三、运行可执行Jar
构建完成后,Jar文件会生成在common-config-qa/build/libs/目录下(命名格式一般为[模块名]-[版本号]-all.jar)。
运行命令
- 在项目根目录执行:
java -jar common-config-qa/build/libs/common-config-qa-0.1-all.jar - 或者进入
common-config-qa模块目录执行:java -jar build/libs/common-config-qa-0.1-all.jar
运行指定测试类
如果只想运行特定的测试类,在命令后加上类的全限定名即可:
java -jar common-config-qa/build/libs/common-config-qa-0.1-all.jar com.test.qa.CommonSpockSpec
四、扩展:包含app-spock-tests模块的测试
如果需要打包并运行app-spock-tests模块的测试,只需:
- 在
app-spock-tests/build.gradle.kts中添加相同的Shadow插件配置(调整主类为SpockMain,打包测试代码和依赖) - 确保
app-spock-tests模块依赖common-config-qa:dependencies { testImplementation(project(":common-config-qa")) } - 构建命令改为
./gradlew :app-spock-tests:shadowJar,运行对应的Jar即可。
内容的提问来源于stack exchange,提问作者user3379502
相关产品推荐
相关产品推荐

