karatelabs/karate · error · RuntimeException
Failed to create resource from URL
Error message
Failed to create resource from URL: {url} What it means
Thrown from the fallback branch of the URL resource factory: when a jar: URL cannot be mounted through the JAR filesystem provider, the code streams the entry content into a MemoryResource instead; if even that openStream/read fails, this error is thrown naming the URL.
Solutions
- Verify the jar file exists and the entry path is correct: 'unzip -l app.jar' and compare the entry path exactly (case-sensitive)
- Inspect the cause chain (ex) to see whether the entry is missing vs a read failure
- Rebuild/redeploy the jar so it actually contains the resource
- If running under jpackage, add the zip filesystem module or ship the resource outside the jar and reference it by file path
Example fix
// before
Resource r = Resource.fromUrl(new URL("jar:file:/app/lib/rules.jar!/rules/discount.js"));
// after
try {
Resource r = Resource.fromUrl(new URL(jarUrl));
} catch (RuntimeException e) {
// fallback: unpack once at startup and use a file resource
Resource r = Resource.fromFilePath("/app/exploded/rules/discount.js");
} Defensive patterns
Strategy: try-catch
Validate before calling
// verify the jar entry exists before loading
java.util.zip.ZipFile zip = new java.util.zip.ZipFile("/app/lib/rules.jar");
if (zip.getEntry("rules/discount.js") == null) {
throw new IllegalStateException("entry missing from jar");
} Try / catch
try {
Resource r = Resource.fromUrl(jarUrl);
} catch (RuntimeException e) {
// cause chain: streaming failure inside the zipfs fallback
throw new IllegalStateException("jar resource unusable: " + jarUrl, e.getCause());
} Prevention
- List jar contents ('unzip -l') to confirm entry paths and casing
- Ship resources outside the jar in jpackage/JavaFX deployments
- Keep entry paths ASCII and lowercase to avoid casing bugs
- Rebuild and redeploy jars after adding resources
When it happens
Trigger: Loading a resource from inside a jar/zip URL where the JAR filesystem provider is unavailable (e.g. jpackage/JavaFX packaged apps) AND url.openStream() or reading the content also throws — typically the jar entry does not exist or the jar file is unreadable/corrupt.
Common situations: jpackage-packaged desktop apps where the NIO zipfs provider is missing; the referenced jar was moved, deleted, or rebuilt; the entry path inside the jar has wrong casing; shaded jars missing the resource.
Understand the failure class
Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.
Related errors
- Failed to load
- Failed to create resource from classpath
- watch mode: cannot watch non-file resource
- watch mode enabled but no watchable files found - features…
- boot.read: file not found
AI-assisted analysis of karatelabs/karate@a22eb90246 (2026-09-12).
Data as JSON: /api/errors/8027a2c65f34c66b.
Report an issue: GitHub.
Appendix: source
Thrown at karate-js/src/main/java/io/karatelabs/common/Resource.java:869
byte[] bytes = FileUtils.toBytes(is);
return root != null ? new UrlResource(url, bytes, root) : new UrlResource(url, bytes);
} catch (Exception e) {
throw new RuntimeException("Failed to fetch content from URL: " + url, e);
}
}
// Handle file:// and jar:// URLs
try {
Path path = urlToPath(url, root);
return root != null ? new PathResource(path, root) : new PathResource(path);
} catch (java.nio.file.ProviderNotFoundException e) {
// JAR file system provider not available (common in jpackage/JavaFX apps)
// Fall back to streaming the resource content
try (java.io.InputStream is = url.openStream()) {
String content = FileUtils.toString(is);
return root != null ? new MemoryResource(content, root) : new MemoryResource(content);
} catch (Exception ex) {
throw new RuntimeException("Failed to create resource from URL: " + url, ex);
}
} catch (Exception e) {
throw new RuntimeException("Failed to create resource from URL: " + url, e);
}
}
}
View on GitHub (pinned to a22eb90246)