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

不使用Maven如何通过CLI运行Cucumber Test runner

报错原因

java.lang.NoClassDefFoundError: io/cucumber/core/cli/Main是运行时classpath没包含cucumber-core依赖包导致的,和代码逻辑无关。无Maven环境下跑Cucumber的核心是手动把所有依赖、编译产物加入classpath,具体操作步骤如下:

前置准备

在项目根目录新建lib文件夹,把项目用到的所有依赖jar全部放进去,包括但不限于:

  • cucumber-core、cucumber-java、cucumber-junit等Cucumber核心包
  • extentreports相关的Cucumber适配器包
  • JUnit包
  • 项目引用的其他第三方工具包
    必须确认lib目录下存在cucumber-core的jar,之前报错缺失的io.cucumber.core.cli.Main类就在这个包内
第一步:编译源码

先执行编译命令,把所有Java源码编译到class输出目录:

# 创建输出目录
mkdir -p target/classes target/test-classes
# 编译步骤定义、Runner类等测试代码,有其他源码路径直接追加在命令末尾即可
javac -cp "lib/*" -d target/test-classes src/test/java/stepdefinitions/*.java src/test/java/CucumberRunner.java

Linux/macOS环境classpath用冒号分隔路径,Windows环境换成分号即可。

第二步:执行测试

两种运行方式选其一即可,不需要额外给Runner类加main方法。

方式1:直接调用Cucumber CLI运行(灵活支持命令行传参指定标签)

运行命令如下,所有配置可以直接在命令行传参,不需要改注解配置:

java -cp "lib/*:target/classes:target/test-classes" io.cucumber.core.cli.Main \
  -g stepdefinitions \
  src/test/resources/features \
  --tags @Regression \
  --plugin pretty \
  --plugin com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter: \
  --plugin timeline:test-output-thread/ \
  --plugin json:target/cucumber-reports/jsonReports/Cucumber.json \
  --plugin html:target/cucumber-reports/Cucumber.html

参数说明:

  • -g后面跟步骤定义类的包名,不是源码目录路径,比如步骤定义类顶部声明package stepdefinitions;,这里就填stepdefinitions,不要填src/test/java/stepdefinitions,否则会找不到步骤绑定
  • --tags后面跟要运行的标签表达式,支持标准Cucumber标签语法:比如跑@Regression且不是@Ignore的用例就写"@Regression and not @Ignore",跑@Smoke或者@Regression的用例就写"@Smoke or @Regression",临时切换运行标签直接改这个参数即可,不需要改代码
  • 后面的--plugin参数和你之前在@CucumberOptions里配置的插件一一对应,保持一致即可

方式2:基于原有Runner类的注解配置运行

你最开始写的带@CucumberOptions注解的CucumberRunner类不需要修改,也不需要加main方法,直接通过JUnit入口运行即可,会自动读取注解里的features路径、标签、插件配置:

java -cp "lib/*:target/classes:target/test-classes" org.junit.runner.JUnitCore CucumberRunner

如果要临时覆盖标签配置,不需要改代码,换成方式1的命令传--tags参数即可。

注意事项
  • 所有编译、运行命令的classpath必须把lib下所有jar、编译后的target/classes、target/test-classes目录全部包含,缺任意一项都可能报类找不到的错误
  • 你之前写的main方法调用逻辑本身没有问题,只要运行时把cucumber-core的jar加入classpath就能正常跑,但没必要额外封装main方法,直接用官方提供的CLI入口更稳定,也不需要改原有代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:54:20