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

  1. Check that the application root and its parents are writable by the process user (ls -ld, chmod/chown).
  2. Verify no regular file exists at the target path or one of its parent directories; remove/rename the conflicting entry.
  3. Check disk space/quota with df on the server host.
  4. 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

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


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/a9d501f1ee4df2a3. Report an issue: GitHub.