quarkusio/quarkus · error · UncheckedIOException
Unable to copy json config file from ${jsonPath} to ${thinJa
Error message
Unable to copy json config file from ${jsonPath} to ${thinJarDirectory} What it means
NativeImageSourceJarBuilder wraps an IOException in an UncheckedIOException when copying a native-image JSON config file (e.g. from native-image properties/config) into the thin jar directory fails. The copy creates the thinJarDirectory then copies the JSON file, and any filesystem failure is rethrown with this descriptive message.
Source
Thrown at core/deployment/src/main/java/io/quarkus/deployment/pkg/jar/NativeImageSourceJarBuilder.java:125
/**
* This is done in order to make application specific native image configuration files available to the native-image tool
* without the user needing to know any specific paths.
* The files that are copied don't end up in the native image unless the user specifies they are needed, all this method
* does is copy them to a convenient location
*/
private static void copyJsonConfigFiles(ApplicationArchivesBuildItem applicationArchivesBuildItem, Path thinJarDirectory)
throws IOException {
for (Path root : applicationArchivesBuildItem.getRootArchive().getRootDirectories()) {
try (Stream<Path> stream = Files.find(root, 1, IsJsonFilePredicate.INSTANCE)) {
stream.forEach(new Consumer<Path>() {
@Override
public void accept(Path jsonPath) {
try {
Files.createDirectories(thinJarDirectory);
Files.copy(jsonPath, thinJarDirectory.resolve(jsonPath.getFileName().toString()));
} catch (IOException e) {
throw new UncheckedIOException(
"Unable to copy json config file from " + jsonPath + " to " + thinJarDirectory,
e);
}
}
});
}
}
}
private static class IsJsonFilePredicate implements BiPredicate<Path, BasicFileAttributes> {
private static final BiPredicate<Path, BasicFileAttributes> INSTANCE = new IsJsonFilePredicate();
@Override
public boolean test(Path path, BasicFileAttributes basicFileAttributes) {
return basicFileAttributes.isRegularFile() && path.toString().endsWith(".json");
}
}View on GitHub (pinned to e1c734241f)
Solutions
- Check file permissions on the source JSON file and the target build directory and ensure they are readable/writable.
- Verify the jsonPath file exists (not deleted between configuration and packaging) and is a regular file.
- Free disk space and run ./mvnw clean, then rebuild the native image source jar.
Example fix
// before (config file missing) quarkus.native.additional-build-args=-H:ResourceConfigurationFiles=missing.json // after (ensure file exists and is readable) ls -l src/main/resources/reflect-config.json quarkus.native.additional-build-args=-H:ResourceConfigurationFiles=src/main/resources/reflect-config.json
Defensive patterns
Strategy: try-catch
Validate before calling
Path json = Path.of("src/main/resources/reflect-config.json");
if (!Files.isRegularFile(json) || !Files.isReadable(json)) {
throw new IllegalStateException("Native-image config JSON missing or unreadable: " + json);
}
if (!Files.isWritable(targetDir)) {
throw new IllegalStateException("Thin jar directory not writable: " + targetDir);
} Try / catch
try {
Files.copy(jsonPath, thinJarDirectory.resolve(jsonPath.getFileName().toString()));
} catch (IOException e) {
throw new IllegalStateException("Failed to copy native-image JSON config " + jsonPath + " to " + thinJarDirectory
+ ": check permissions, disk space, and that the source file exists", e);
} Prevention
- Verify all native-image JSON config paths exist before building.
- Keep target/ free of stale locks and ensure sufficient disk space.
- Check directory write permissions before running native packaging builds.
When it happens
Trigger: Building the native image source jar with additional native-image JSON config files while the filesystem fails: thinJarDirectory cannot be created or the source jsonPath is unreadable (permissions, missing file, disk full, path is a directory).
Common situations: Read-only target/ directory; stale build processes locking files on Windows; a configured native-image config JSON path pointing to a file that was removed; insufficient disk space.
Related errors
- remote-dev can only be used with mutable applications i.e. u
- Unknown JAR package type '${value}'
- Additional application archives can only be provided from th
- Multiple GeneratedClassBuildItem were produced for the same
- Unable to locate effective artifact
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/d44d9b0625023732.
Report an issue: GitHub.