Karate 1.4.0读取.properties文件报错:GraalVM多语言异常
Karate 1.4.0 读取Classpath下Properties文件报错的解决办法
问题背景
在Karate 0.9.6版本中,以下代码可正常加载classpath下的karate.properties文件:
def stream = read('classpath:karate.properties') def props = new java.util.Properties() eval props.load(stream)
但升级至Karate 1.4.0后,执行时抛出文件未找到错误:
js failed: 01: read('classpath:karate.properties')
org.graalvm.polyglot.PolyglotException: not found: karate.properties
错误栈信息:
- com.intuit.karate.resource.ResourceUtils.getResource(ResourceUtils.java:126)
- com.intuit.karate.core.ScenarioFileReader.toResource(ScenarioFileReader.java:129)
- com.intuit.karate.core.ScenarioFileReader.readFileAsStream(ScenarioFileReader.java:99)
- com.intuit.karate.core.ScenarioFileReader.readFile(ScenarioFileReader.java:76)
- com.intuit.karate.core.ScenarioEngine.lambda$new$0(ScenarioEngine.java:121)
- .:program(Unnamed:1)
原因分析
Karate 1.x版本全面切换至GraalJS作为JavaScript引擎,同时调整了read方法的行为逻辑:旧版本中read('classpath:xxx')直接返回文件输入流,新版本中read会根据文件类型自动解析内容(比如Properties文件会直接转为Map对象),资源路径的解析规则也有变化。
解决方案
方案1:使用Karate内置的Properties解析(推荐)
Karate 1.x支持直接读取Properties文件并转为Map,无需手动调用Java API加载,代码简化为:
def props = read('classpath:karate.properties')
之后可直接通过props.keyName的方式访问配置项。
方案2:兼容旧逻辑(保留Java API加载)
如果必须保留原有的java.util.Properties加载逻辑,需改用Karate提供的karate.resource()方法获取输入流:
def stream = karate.resource('karate.properties').getInputStream() def props = new java.util.Properties() props.load(stream)
方案3:全局配置加载
若需在所有Feature文件中共享配置,可在karate-config.js中提前加载:
var props = read('classpath:karate.properties'); config.props = props;
后续在Feature文件中直接引用props.keyName即可。
内容的提问来源于stack exchange,提问作者ashwin
相关产品推荐
相关产品推荐

