使用JUnit+Cucumber生成Extent报告时遇NoClassDefFoundError问题求助
java.lang.NoClassDefFoundError: gherkin/formatter/Reporter with Cucumber + JUnit + Extent Reports Hey there, let's tackle this frustrating error you're hitting. That NoClassDefFoundError for gherkin/formatter/Reporter is almost always tied to dependency version mismatches or missing required libraries between Cucumber, Gherkin, and the Extent Reports adapter. Here's how to fix it step by step:
1. Verify Version Compatibility Between Cucumber, Gherkin, and Extent Adapter
The biggest culprit here is using mismatched versions. The gherkin/formatter/Reporter class was part of older Gherkin versions, and newer Cucumber releases (v5+) restructured their dependencies, which breaks older Extent adapters.
Example Compatible Dependency Sets
For Cucumber 4.x (stable with older Extent adapters):
<!-- Cucumber Core --> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> <!-- Extent Reports Adapter for Cucumber 4 --> <dependency> <groupId>com.aventstack</groupId> <artifactId>extentreports-cucumber4-adapter</artifactId> <version>1.0.12</version> <scope>test</scope> </dependency> <!-- Gherkin (aligns with Cucumber 4.x) --> <dependency> <groupId>io.cucumber</groupId> <artifactId>gherkin</artifactId> <version>5.1.0</version> <scope>test</scope> </dependency>
For Cucumber 7.x (latest, uses updated Extent adapters):
If you're on a newer Cucumber version, you need the corresponding Extent adapter that supports the new Gherkin structure:
<!-- Cucumber Core --> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>7.14.0</version> <scope>test</scope> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit-platform-engine</artifactId> <version>7.14.0</version> <scope>test</scope> </dependency> <!-- Extent Reports Adapter for Cucumber 7 --> <dependency> <groupId>com.aventstack</groupId> <artifactId>extentreports-cucumber7-adapter</artifactId> <version>1.12.0</version> <scope>test</scope> </dependency>
2. Remove Conflicting or Duplicate Dependencies
Check your pom.xml for duplicate Gherkin or Cucumber entries. Sometimes Maven pulls in transitive dependencies that clash with your explicit ones. Run this command to list all dependencies and spot duplicates:
mvn dependency:tree
If you find conflicting versions, exclude the unwanted ones using Maven's <exclusions> tag in your dependency entries.
3. Clean and Rebuild Your Project
Maven cache can sometimes hold corrupted or outdated jars. Run these commands to refresh everything:
mvn clean mvn install -U
The -U flag forces Maven to update snapshots and release dependencies.
4. Validate Your Cucumber Runner Class
Make sure your runner class uses the correct annotations for your Cucumber version:
- For Cucumber 4.x + JUnit 4:
import org.junit.runner.RunWith; import io.cucumber.junit.Cucumber; import io.cucumber.junit.CucumberOptions; @RunWith(Cucumber.class) @CucumberOptions( features = "src/test/resources/features", glue = "com.yourpackage.stepdefinitions", plugin = {"com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter:"} ) public class TestRunner { }
- For Cucumber 7.x + JUnit 5:
import io.cucumber.junit.platform.engine.Cucumber; @Cucumber @CucumberOptions( features = "src/test/resources/features", glue = "com.yourpackage.stepdefinitions", plugin = {"com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter:"} ) public class TestRunner { }
5. Double-Check Extent Plugin Configuration
Ensure the plugin entry in @CucumberOptions matches your adapter version—both Cucumber 4 and 7 use the same plugin path, but the adapter itself must be the correct version for your Cucumber setup.
If you've tried all this and still hit the error, share your full pom.xml and runner class code, and we can dig deeper!
内容的提问来源于stack exchange,提问作者user3262269

