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

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.json
    
    结构调整完成后,原有代码中的read('classpath:requests/first.json')不需要修改即可正常运行。
  • 保留现有目录结构方案:修改构建工具配置,将java目录下的json等资源文件纳入测试资源扫描范围
    使用Maven时,在pom.xml的<build>节点下添加如下配置:
    <testResources>
      <testResource>
        <directory>src/test/java</directory>
        <includes>
          <include>**/*.json</include>
          <include>**/*.feature</include>
        </includes>
      </testResource>
    </testResources>
    
    使用Gradle时,在build.gradle中添加如下配置:
    sourceSets {
      test {
        resources {
          srcDir file('src/test/java')
          include '**/*.json', '**/*.feature'
        }
      }
    }
    
    配置完成后先执行一次测试编译命令(Maven执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:31:12