quarkusio/quarkus · error · RuntimeException
IOException (wrapped)
Error message
IOException (wrapped)
What it means
RuntimeUpdatesProcessor.updateFile writes file content received from a remote dev-mode client into the application root. Any IOException while creating parent directories or writing the file is wrapped in a RuntimeException and rethrown, aborting the file sync. This indicates the server-side filesystem rejected the write during remote development mode.
Source
Thrown at core/deployment/src/main/java/io/quarkus/deployment/dev/RuntimeUpdatesProcessor.java:444
compileOutput = QuarkusConsole.INSTANCE.registerStatusLine(QuarkusConsole.COMPILE_ERROR);
}
}
}
return compileOutput;
}
@Override
public void updateFile(String file, byte[] data) {
requireNonNull(data, "data");
Path resolve = resolveApplicationPath(file);
try {
if (!Files.exists(resolve.getParent())) {
Files.createDirectories(resolve.getParent());
}
validateExistingPathComponents(applicationRoot.toAbsolutePath().normalize(), resolve, file);
Files.write(resolve, data);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void deleteFile(String file) {
Path resolve = resolveApplicationPath(file);
try {
Files.deleteIfExists(resolve);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private Path resolveApplicationPath(String file) {
file = normalizeFile(file);
Path normalizedRoot = applicationRoot.toAbsolutePath().normalize();
Path relativePath = Path.of(file);
Path resolved = normalizedRoot.resolve(relativePath).normalize();View on GitHub (pinned to e1c734241f)
Solutions
- Check that the application root and its parents are writable by the process user (ls -ld, chmod/chown).
- Verify no regular file exists at the target path or one of its parent directories; remove/rename the conflicting entry.
- Check disk space/quota with df on the server host.
- Run the dev server in a writable container/volume, not a read-only mount.
Example fix
// server side: ensure writable root // before: ./mvnw quarkus:dev -Dquarkus.launch.devmode=true (root read-only) // after: chmod u+w target/classes && ./mvnw quarkus:dev -Dquarkus.launch.devmode=true
Defensive patterns
Strategy: validation
Validate before calling
Path root = Path.of(".").toAbsolutePath().normalize();
Path target = root.resolve(relPath).normalize();
if (!target.startsWith(root)) throw new IllegalArgumentException("path escapes root");
Files.createDirectories(target.getParent());
if (!Files.isWritable(target.getParent())) throw new IllegalStateException("parent not writable: " + target.getParent()); Try / catch
try {
runtimeUpdatesProcessor.updateFile(file, data);
} catch (RuntimeException e) {
Throwable cause = e.getCause();
if (cause instanceof IOException io) {
log.warnf("File sync failed for %s: %s", file, io.getMessage());
// inspect permissions/space and retry
} else throw e;
} Prevention
- Keep the application root writable by the dev-server user
- Never place regular files where directories are expected under the root
- Monitor disk space on dev servers
- Avoid read-only container mounts for dev mode
When it happens
Trigger: Calling updateFile(file, data) via the remote-dev HTTP sync endpoint when Files.createDirectories(resolve.getParent()) or Files.write(resolve, data) throws IOException — e.g. read-only application root, disk full, or a path component being an existing non-directory file.
Common situations: Application root directory permissions changed after startup; a regular file exists where a directory is needed; disk quota exceeded on the remote dev server; container filesystem mounted read-only.
Related errors
- Unable to validate the application root for remote-dev path:
- Unable to validate remote-dev path: <file>
- Failed to create output directory for generated sources: %s
- Path leaves the application root: <file>
- Cannot create directory ${directory}
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/a9d501f1ee4df2a3.
Report an issue: GitHub.