Cucumber Kotlin可执行Jar运行时提示所有场景未定义
问题:Cucumber Kotlin可执行Jar运行时所有场景未定义
我正在尝试为Cucumber Kotlin应用创建可执行Jar包,但运行该Jar时日志打印所有场景均未定义:
... 3 Scenarios (3 undefined) 8 Steps (5 skipped, 3 undefined) ...
该应用在命令行或IntelliJ中均可正常执行。
程序入口代码
package dsdms.client import io.cucumber.core.cli.Main class Main{ companion object{ @JvmStatic fun main(args: Array<String>) { Main.main("-p", "pretty", "--glue", "dsdms.client.cucumber", "--plugin", "html:build/reports/cucumber", "classpath:features") println("Hello Worldddd2!") } } }
Gradle构建配置
我使用Gradle Kotlin DSL进行项目构建,先后尝试将代码放在src/test和src/main目录,控制台执行正常,但Jar运行仍有问题。生成胖Jar的配置如下:
tasks.withType<Jar> { duplicatesStrategy = DuplicatesStrategy.EXCLUDE manifest { attributes["Main-Class"] = "dsdms.client.Main" } dependsOn(configurations.runtimeClasspath) from({ configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) } }) destinationDirectory.set(file("$buildDir/output")) }
Jar包内部已包含执行所需的所有文件,项目模块结构也符合预期。
解决方案
问题根源
当前胖Jar构建逻辑未正确处理Cucumber的features资源文件和步骤定义类的类路径扫描,若步骤定义在src/test目录下,runtimeClasspath也不会自动包含测试代码与资源。
修复步骤
调整Gradle配置,打包测试代码与资源
替换原Jar任务配置,自定义fatJar任务确保包含主代码、测试代码、所有依赖及测试资源:tasks.register<Jar>("fatJar") { duplicatesStrategy = DuplicatesStrategy.EXCLUDE manifest { attributes["Main-Class"] = "dsdms.client.Main" } // 打包主代码与测试代码 from(sourceSets.main.get().output) from(sourceSets.test.get().output) // 引入运行时与测试依赖 val runtimeClasspath = configurations.runtimeClasspath.get() val testRuntimeClasspath = configurations.testRuntimeClasspath.get() dependsOn(runtimeClasspath, testRuntimeClasspath) from({ (runtimeClasspath + testRuntimeClasspath).filter { it.name.endsWith("jar") }.map { zipTree(it) } }) // 打包测试资源(features文件) from(sourceSets.test.get().resources) destinationDirectory.set(file("$buildDir/output")) }验证类路径与参数
- 解压Jar确认
dsdms/client/cucumber路径下存在步骤定义的class文件 - 确保
--glue参数指定的包路径与步骤定义类的包完全一致,可尝试给features路径添加根斜杠:classpath:/features
- 解压Jar确认
生成并运行Jar
执行./gradlew fatJar生成胖Jar,再通过java -jar build/output/[Jar文件名].jar运行。
内容的提问来源于stack exchange,提问作者Denys
相关产品推荐
相关产品推荐

