构建独立可执行Cucumber Jar遇类找不到错误,求解决方案
解决Cucumber+Selenium项目打包可执行Jar的问题
问题根源分析
- 依赖范围错误:你的Cucumber核心依赖(
cucumber-java、cucumber-junit-platform-engine)都设置了<scope>test</scope>,Maven打包时会排除test范围的依赖,导致Jar里缺少Cucumber相关类,运行时找不到io.cucumber.core.cli.Main。 - 测试代码未被打包:你的.feature文件、Step定义类都在
src/test目录下,默认Maven插件只会打包src/main下的代码,这些测试资源不会被包含到Jar中。 - 冗余配置:
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
相关产品推荐
相关产品推荐

