You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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也不会自动包含测试代码与资源。

修复步骤

  1. 调整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"))
    }
    
  2. 验证类路径与参数

    • 解压Jar确认dsdms/client/cucumber路径下存在步骤定义的class文件
    • 确保--glue参数指定的包路径与步骤定义类的包完全一致,可尝试给features路径添加根斜杠:classpath:/features
  3. 生成并运行Jar
    执行./gradlew fatJar生成胖Jar,再通过java -jar build/output/[Jar文件名].jar运行。


内容的提问来源于stack exchange,提问作者Denys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:52:54