Headless Java scanner for Meteor Client addons


Extract module metadata, settings, and configuration from addon JARs without launching Minecraft.
| Step | Command |
|---|
| Prerequisites | Java 25 JDK (Gradle wrapper is included) |
| Clone | git clone <repo-url> && cd addon-parser |
| Generate stubs | ./gradlew generateStubs -PparserProfile=26x |
| Run tests | ./gradlew test -PautoGenerateStubs -PparserProfile=26x --no-daemon |
| Scan addons | ./gradlew run -PparserProfile=26x --args="--input fixtures/addons/jars/26x --output output/26x --profile 26x" |
Fixture JARs for both profiles are checked in under fixtures/addons/jars/, so the test and scan commands work out of the box.
| Argument | Description |
|---|
--input | Path to an addon JAR or a directory of JARs |
--output | Output directory for per-JAR JSON files (default: output) |
--summary | Path for the aggregate summary JSON (default: <output>/summary.json) |
--mode | LEGACY (in-process) or ISOLATED (forked worker JVM) |
--profile | 26x or legacy; falls back to addonparser.profile or -PparserProfile |
./gradlew run -PparserProfile=26x --args="--input fixtures/addons/jars/26x --output output/26x --summary output/26x/summary.json --profile 26x"
./gradlew run -PparserProfile=legacy --args="--input fixtures/addons/jars/legacy --output output/legacy --summary output/legacy/summary.json --profile legacy --mode ISOLATED"
| Feature | Description |
|---|
| Headless scanning | No Minecraft, no GUI, no game tick loop — just the JVM |
| Fabric mod parsing | Reads fabric.mod.json and locates MeteorAddon entrypoints |
| Runtime emulation | Stubs for Meteor Client systems: Modules, Settings, HUD, Commands |
| Two scan modes | In-process for speed, or a forked worker JVM for isolation |
| Profile support | Separate compatibility shim sets for 26x Mojmap and legacy Yarn addons |
| Mapping normalization | Resolves obfuscated and intermediary names to readable ones where possible |
| Sandboxed writes | Addon runtime writes are confined to tmp/addon-parser-runtime and cleaned up by default |
| Profile | Fixtures | Count | Notes |
|---|
| 26x | fixtures/addons/jars/26x | 9 jars | Mojmap-oriented Meteor 0.6.x / Minecraft 26.x; default profile |
| legacy | fixtures/addons/jars/legacy | 24 jars | 1.21.x Yarn / intermediary addons |
| File | Contents |
|---|
{jarName}.json | jarName / jarPath, success, errors / warnings, addons[], modules[] |
summary.json | Aggregate stats across every scanned JAR |
Each ModuleDump includes:
| Field | Description |
|---|
name | Display name |
category | Meteor category (Combat, Render, Misc, ...) |
description | Module description |
aliases | Alternative command names |
className | Fully qualified class name |
settings | SettingDump[] with name, type, and default value |
settingGroups | Nested setting group structure |
| Property | Description | Default |
|---|
addonparser.profile | Runtime mapping profile (26x or legacy) | 26x |
addonparser.fixtureJarsDir | Override the test fixture directory | fixtures/addons/jars/<profile> |
addonparser.runtimeTmpDir | Temp directory for sandboxed runtime artifacts | tmp/addon-parser-runtime |
addonparser.keepTmp | Keep temp artifacts after scan for debugging | false |
addonparser.meteorFolder | Override the emulated Meteor folder | managed per scan |
addonparser.yarnAutoDownload | Allow the legacy resolver to download missing Yarn mappings | true |
addonparser.yarnMappingsVersions | Specific Yarn mapping versions to use | auto-detected |
addonparser.mappingsDir | Cached mappings directory | mappings |
addonparser.yarnMappingsJar | Explicit list of Yarn mapping JARs | unset |
Built with Java 25 and Gradle (Groovy DSL); bytecode analysis via ASM, JSON via Jackson/Gson.
| Task | Command |
|---|
| Build | ./gradlew build -PautoGenerateStubs -PparserProfile=<profile> --no-daemon |
| Test | ./gradlew test -PautoGenerateStubs -PparserProfile=<profile> --no-daemon |
| Generate stubs | ./gradlew generateStubs -PparserProfile=<profile> |
| Format | ./gradlew spotlessApply --no-daemon |