JVM Toolchain

Compile, run, format, test, and package Java and Kotlin

Elide includes the commands needed for common Java and Kotlin workflows. The 1.5.0 toolchain supports Java 25 and Kotlin 2.4.10.

Compile and run

elide javac -- -d out Hello.java
elide java -- -cp out Hello

elide kotlinc -- -d out Hello.kt
elide java -- -cp out HelloKt

Options for the wrapped compiler or runtime go after --.

Format

Format Java and Kotlin together:

elide format -- src
elide format -- -n src # check only

Use elide javaformat or elide ktfmt when you need options specific to one formatter.

Build a project

With an elide.pkl manifest, Elide can install Maven dependencies, compile source sets, run tests, and assemble declared artifacts:

elide install
elide build
elide test

JVM tests require a test source set in the manifest.

Compile progress

While elide build compiles a Java source set, the task line names the file javac is working on and the progress bar fills as each source file completes, so a large compile shows movement instead of an unchanging spinner. Kotlin has no equivalent per-file hook, so its task line reports the source count it is working through. Progress lines are part of the interactive display: in CI, when output is redirected, or under an AI agent harness, the build prints plain per-task lines only.

Progress reaches the display the same way in every distribution. When the compilers run in-process — JVM mode, or a native-image build where jvmtools is folded into the engine itself (musl, or --no-jvmtools-library) — the compiler calls the build’s receiver directly. On the default split native distribution the compilers run inside libjvmtools, and each event is sent back to the engine as it happens over a native callback the compile call carries with it.

Compiler diagnostics travel the same channel, so a warning or an error appears while the compile that produced it is still running, in the order the compiler emitted it, rather than arriving as a batch once the task finishes. The same applies to elide javaformat, elide ktfmt and elide format, whose task lines name each file as it is checked or rewritten, and say what happened to it: left alone, rewritten, would be rewritten, or failed to parse — or, for the rare invocation only the tool’s own driver can answer, simply that it was checked.

Existing build systems

Existing builds can invoke Elide’s compiler wrappers directly with the same argument boundary used above. Bazel integrations can use the persistent-worker mode exposed by elide javac --persistent_worker and elide kotlinc --persistent_worker.

Gradle and Maven plugins are released separately from the Elide binary. Their setup is intentionally not duplicated here because plugin versions and configuration can change independently. Use the direct compiler commands when you need a versioned, binary-owned interface.

Reference

Run elide --help-all for the complete command list.