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

构建独立可执行Cucumber Jar遇类找不到错误,求解决方案

解决Cucumber+Selenium项目打包可执行Jar的问题

问题根源分析

  1. 依赖范围错误:你的Cucumber核心依赖(cucumber-java、cucumber-junit-platform-engine)都设置了<scope>test</scope>,Maven打包时会排除test范围的依赖,导致Jar里缺少Cucumber相关类,运行时找不到io.cucumber.core.cli.Main。
  2. 测试代码未被打包:你的.feature文件、Step定义类都在src/test目录下,默认Maven插件只会打包src/main下的代码,这些测试资源不会被包含到Jar中。
  3. 冗余配置:maven-assembly-plugin不需要作为依赖放在<dependencies>节点,只需在<build/plugins>中配置即可。

修复步骤

1. 调整依赖范围

修改Cucumber相关依赖的scope,去掉<scope>test</scope>,让Maven打包时包含这些依赖:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-java</artifactId>
    <!-- 移除test scope -->
</dependency>

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-junit-platform-engine</artifactId>
    <!-- 移除test scope -->
</dependency>

2. 配置Assembly插件包含测试代码和资源

修改maven-assembly-plugin的配置,添加<includeTestScope>true</includeTestScope>,同时确保主类配置正确:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.4.2</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>io.cucumber.core.cli.Main</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <!-- 包含test范围的代码和依赖 -->
        <includeTestScope>true</includeTestScope>
    </configuration>
    <executions>
        <execution>
            <id>assemble-all</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

3. 移除冗余依赖

从<dependencies>中删除maven-assembly-plugin的依赖项,插件只需在build节点配置:

<!-- 删除以下冗余配置 -->
<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.4.2</version>
</dependency>

4. 重新打包并运行

执行打包命令:

mvn clean package

打包完成后,在target目录找到CucumberSelenium-1.0-SNAPSHOT-jar-with-dependencies.jar,运行时需指定Cucumber参数(替换为你的实际包名和feature路径):

java -jar CucumberSelenium-1.0-SNAPSHOT-jar-with-dependencies.jar --glue com.example.stepdefs src/test/resources/features

备选方案:自定义主类启动Cucumber

如果不想依赖Cucumber的CLI主类,可自定义启动类:

package com.example;

import io.cucumber.core.cli.Main;

public class CucumberRunner {
    public static void main(String[] args) {
        String[] cucumberArgs = {
            "--glue", "com.example.stepdefs",
            "src/test/resources/features"
        };
        Main.run(cucumberArgs, Thread.currentThread().getContextClassLoader());
    }
}

然后修改Assembly插件的主类配置:

<mainClass>com.example.CucumberRunner</mainClass>

运行Jar时无需额外参数:

java -jar CucumberSelenium-1.0-SNAPSHOT-jar-with-dependencies.jar

内容的提问来源于stack exchange,提问作者Lâm Nghĩa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:40:30