JDK11/19运行Cucumber特性文件报ClassGraph类未找到错误求助
解决JDK11/19下Karate执行Cucumber Feature时的ClassGraph类找不到问题
问题复现
使用JDK11或19,在名为demo的Maven项目中通过「Run as -> cucumber feature」执行Karate特性文件时,抛出错误:
Exception in thread "main" java.lang.NoClassDefFoundError: io/github/classgraph/ClassGraph
项目已引入Karate框架依赖,Maven本地仓库中存在classgraph-4.8.149.jar,但JDK8下运行完全正常。
解决方法
1. 升级Karate版本到兼容JDK11+的版本
旧版Karate(如1.3.x及以下)对JDK9+引入的模块系统(JPMS)适配不足,建议直接升级到Karate 1.4.0及以上版本,新版本已优化对JPMS的支持,可自动处理ClassGraph的类加载逻辑。
2. 显式添加ClassGraph测试依赖
若升级Karate后仍存在问题,直接在pom.xml中显式声明ClassGraph的测试依赖,避免传递依赖缺失:
<dependency> <groupId>io.github.classgraph</groupId> <artifactId>classgraph</artifactId> <version>4.8.149</version> <scope>test</scope> </dependency>
3. 修正IDE运行配置的类路径
在Eclipse中检查Cucumber运行配置的类路径:
- 打开「Run Configurations」,找到对应的Cucumber Feature配置项
- 切换到「Classpath」标签,确认
classgraph-4.8.149.jar在「Test classpath」列表中 - 若缺失,点击「Add JARs...」,从Maven本地仓库中找到该jar并添加
4. 适配JDK模块系统
- 模块化项目(含
module-info.java):在模块声明中添加对ClassGraph的依赖:
module demo { requires io.github.classgraph; requires com.intuit.karate; // 其他必要的模块依赖声明 }
- 非模块化项目:在运行VM参数中添加以下配置,放开JDK内部API的访问限制:
--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED
5. 清理并重新构建项目
执行Maven清理构建命令,确保依赖被正确同步:
mvn clean install
随后在IDE中右键项目 -> 「Maven」-> 「Update Project」,强制刷新依赖缓存。
内容的提问来源于stack exchange,提问作者KK12
相关产品推荐
相关产品推荐

