What users install from maddi: the command-line distributions, the Gradle and Maven plugins, and the IDE plugins with the analysis daemon behind them. maddi's README explains what maddi computes; this one explains how to run it.
The analyzer needs JDK 25 or later to run. The Kotlin distribution needs JDK 26 or later.
Two self-contained zips on the GitHub release. Unpack and
run: every jar is in lib/, and the launcher carries the JVM flags the analyzer needs.
| Zip | Launcher | Analyses |
|---|---|---|
maddi-<version>.zip (maddi-cli) |
bin/maddi |
Java |
maddi-kotlin-<version>.zip (maddi-cli-kotlin) |
bin/maddi-kotlin |
Java and Kotlin |
bin/maddi-kotlin takes the same command line as bin/maddi and does strictly more. On a project with no .kt
file, it runs the Java analyzer and behaves identically. Take the small zip for a Java-only build: the Kotlin one
carries about 85 MB of K2 compiler jars. Kotlin support ships only this way, because it depends on JetBrains
artifacts that are not on Maven Central.
An option the mixed Java/Kotlin pipeline cannot honour yet is refused by name, with exit code 7, never run as a
no-op. Writing analysis results, incremental analysis and the hints compiler are among those options. --translate
is one too: a project with Kotlin sources has no single Java program to translate. --skip-kotlin-sources analyses
only the Java part of a mixed project, and accepts an incomplete result.
To point the CLI at a project, capture what the build compiled and hand it over. No build-tool integration is needed:
./gradlew :your-module:compileJava --debug 2>&1 | grep 'Compiler arguments:' > build.log
maddi --compile-log build.log --analysis-steps modification --analysis-results-dir out--compile-log also reads Maven and Ant logs. The analysis loads the JDK and library results that ship with maddi;
--preload-analysis-results-dirs none turns that off.
The same command line translates the project's main sources:
maddi --compile-log build.log --translate kotlin --translate-output kotlin-src
maddi --compile-log build.log --translate csharp --translate-output csharp-src # experimental; with a Translated.csprojThe modification analysis and the nullability pass run first, and their verdicts decide T or T?, where !! (or
!) is needed, and which collections are read-only. --analysis-steps none translates without them.
translation-report.txt in the output lists the printer's crashes and messages; a crash leaves that one file out and
exits non-zero.
io.codelaser.maddi.analyzer on the Gradle Plugin
Portal:
plugins {
java
id("io.codelaser.maddi.analyzer") version "0.9.5"
}
maddi {
analysisSteps = "modification" // parse -> prep -> modification -> write results
}./gradlew maddi-analyzer # one result .json per package, under build/maddiThe plugin takes the source sets, the classpath, the language level and --enable-preview from the Gradle model,
and forks a worker JVM with the flags the analyzer needs. Its options are in
maddi-gradleplugin/README.md.
io.codelaser:maddi-mvnplugin on Maven Central, goal prefix maddi, five goals: run,
write-input-configuration, statistics, write-analysis-hints and compile-analysis-hints. The JVM that runs
Maven needs javac's --add-exports flags for the analysis goals. Set them once in .mvn/jvm.config or
MAVEN_OPTS; the user manual lists them.
The IntelliJ, Eclipse and VS Code plugins are not published yet. Each shows maddi's computed annotations in the
editor. All three talk to the same analysis daemon (maddi-ide-daemon), which runs out of process, so the IDE can stay on any
JVM.
| IDE | Module | Build | Notes |
|---|---|---|---|
| IntelliJ IDEA | maddi-intellij |
./gradlew :maddi-intellij:buildPlugin, or runIde to try it |
Java and Kotlin. The Kotlin front end is downloaded on demand from the release and checked against its SHA-256. |
| Eclipse 2025-09+ | maddi-eclipse |
task eclipse:build (a p2 update site) |
maddi-eclipse/README.md |
| VS Code | maddi-vscode |
task vscode:package (a .vsix) |
Needs redhat.java. maddi-vscode/README.md |
task --list shows the other tasks, and task doctor checks the toolchain.
maddi-intellij-j2k is not a plugin. It is a headless starter that runs IntelliJ's own J2K converter on a corpus, so
that maddi's Kotlin translation can be compared with it.
Check out the three repositories side by side, as described in maddi's README:
./gradlew build
./gradlew :maddi-cli:installDist # the `maddi` CLI, in maddi-cli/build/install/maddi
./gradlew :maddi-ide-daemon:installDist # the daemon the IDE plugins bundlerelease-cli.sh <tag> builds both zips and publishes them, with their checksums, on the GitHub release for that tag.
dogfood/ is a standalone build that applies the Gradle plugin to maddi's own CST. It is the proving ground for
eventual immutability; see dogfood/README.md.
| Repository | Holds | Depends on |
|---|---|---|
| maddi | the base: CST, front ends, printers, the AnalysisEngine interface |
nothing above it |
| maddi-mod | the analyses | the base only |
| maddi-dist | what users install | compiles against the base only; carries maddi-mod at run time |
Every module here reaches the analyses through io.codelaser.maddi.analysis.api.AnalysisEngine. maddi-mod modules
may appear only in runtimeOnly configurations, or shadeRuntime in the plugins. The maddi-tier-guard plugin, in
maddi's build-logic, fails the build when a compile class path resolves one.
Licence: LGPL-3.0-or-later (COPYING, COPYING.LESSER), as maddi.