Karate框架报PolyglotException找不到classpath下已存在的请求文件
问题根因
Karate依赖classpath加载非feature类资源时,Maven、Gradle等构建工具默认只会把src/test/resources下的文件、src/test/java下的Java/feature类文件纳入测试classpath,放在src/test/java下的json等格式文件不会被默认拷贝到测试编译输出目录,因此会抛出文件找不到的异常。把json移入features目录可正常运行,是因为Karate支持相对于当前feature文件位置的相对路径寻址,不依赖全局classpath扫描规则。
可行解决方案
- 官方推荐方案:调整目录结构,将所有非Java测试资源统一放入
src/test/resources目录
标准目录结构参考:
结构调整完成后,原有代码中的src └── test ├── java │ └── 存放Karate启动Runner等Java测试类 └── resources ├── features │ └── 所有后缀为.feature的测试脚本 └── requests └── first.jsonread('classpath:requests/first.json')不需要修改即可正常运行。 - 保留现有目录结构方案:修改构建工具配置,将java目录下的json等资源文件纳入测试资源扫描范围
使用Maven时,在pom.xml的<build>节点下添加如下配置:
使用Gradle时,在build.gradle中添加如下配置:<testResources> <testResource> <directory>src/test/java</directory> <includes> <include>**/*.json</include> <include>**/*.feature</include> </includes> </testResource> </testResources>
配置完成后先执行一次测试编译命令(Maven执行sourceSets { test { resources { srcDir file('src/test/java') include '**/*.json', '**/*.feature' } } }mvn clean test-compile,Gradle执行gradle compileTestJava),再运行测试即可。 - 零配置快速修复方案:改用相对路径读取文件
若feature文件存放在java/features目录下,json文件存放在java/requests目录下,直接将read语句修改为相对当前feature位置的路径即可,无需调整目录或构建配置:* def requestBody = read('../requests/first.json')
注意事项
- 执行测试前建议先清理编译缓存,避免旧的编译产物导致文件找不到问题反复出现。
- 若使用IDE运行测试,需要确认IDE的测试资源配置和构建工具配置一致,避免IDE自身的classpath扫描规则和构建工具不匹配导致的异常。
内容的提问来源于stack exchange,提问作者Malyalamvenu Gopal
相关产品推荐
相关产品推荐

