Build1 publisher2 min readPublished
Netflix's ja must derive module coordinates for 520 of Maven Central's top 1,000 artifacts
Danny Thomas's preview toolchain makes module-info.java the source of truth for dependencies, packaging and symbol search, so a coding agent working from a shell can resolve and navigate a Java project without an IDE index.
The Engineer · Build desk

What happened
- Netflix JVM engineer Danny Thomas has released a preview of ja, a command-line Java toolchain for developers and coding agents built around the language's module system instead of the class path.
- ja treats module-info.java as the source of truth, recording dependency versions beside standard requires directives and keeping metadata such as the application's main class in documentation tags.
- Under the ja orchestration layer sit four tools usable on their own: jig for resolution and assembly, jfmt for formatting, jist for symbol search and jdocserver for local API documentation.
- Each tool implements Java's Tool or ToolProvider interfaces so it can run inside a Java process, and the set is intended to ship inside a JDK beside jdeps, jlink and jshell.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- constraint Slightly more than half the popular ecosystem has never stated a module name, so the descriptor-as-contract idea leans on derived coordinates and naming heuristics for most dependencies a real build pulls in.
- cost The compatibility work falls on library owners: one relocation POM per artifact is the price of being reachable by the canonical module coordinate.
- decision A team on Gradle now weighs build caching, plugins and multi-project support it already has against a project description an agent can read without an index.
- capability Exact-symbol and semantic-usage search from a shell lets an agent navigate a codebase without depending on an editor process it cannot drive.
An IDE keeps a compiled view of the project in memory. It navigates declarations, organizes imports and answers usage questions from an index it maintains without being asked [3]. Through a terminal, a coding agent gets none of it for free. Thomas argues in the Netflix TechBlog post that Java's strong IDE experience left the language with fewer small command-line tools than coding agents now need [2].
The plumbing is conventional, which is the good part. jig reads the descriptor, resolves module versions, emits the standard module-system arguments that javac, java, javadoc and jlink already accept, and connects the module model to Maven repositories [7]. Discovery and publishing still go through Maven Central [13]. Output is deliberately terse so an agent can keep the information that matters inside its context limits [12]. runtimewire.com frames the exercise as a test of whether dependencies, source navigation and access controls can be made legible to agents without hiding the project model inside an IDE or a build DSL [23].
Netflix counted explicit module definitions and automatic module names across the 1,000 most popular Maven Central artifacts, and the two groups sum to 480, leaving 520 that state no preference at all [15]. For those, Thomas derives canonical module coordinates from Maven's verified group namespaces [16], while jig infers likely coordinates from common naming conventions and carries aliases for popular modules that lack reverse-domain names [17]. That alias table grows as more artifacts need exceptions. A library owner who wants the mapping to be explicit can publish a relocation POM pointing from the canonical coordinate to the artifact's established location [16].
That 48% is a measurement of the top of the repository by popularity, not of any particular build [15]. For it to describe a given project, that project's dependency closure has to be drawn from roughly the same population. A tree carrying older or narrowly used artifacts will land on the inference path more often. runtimewire.com calls the compatibility work the part most likely to determine whether ja graduates from an interesting design to a useful development system [20].
Maven 4 already distinguishes class-path and module-path artifacts, and Gradle has years of investment in dependency management, build caching, plugins and multi-project builds [18]. Thomas offers a narrower proposition, that Java's own module descriptor becomes the durable contract shared by the compiler, packaging tools, developers and coding agents [19].
Thomas is a Melbourne-based developer productivity engineer who has worked on Netflix's Java build ecosystem and JVM performance [21]. In March 2024 he reported that over half of Netflix's critical streaming-video services were running JDK 21 with generational ZGC [22].
What to watch
- Whether the four tools land inside a JDK beside jdeps, jlink and jshell or stay a separate install.
- Whether popular library owners begin publishing relocation POMs for the canonical coordinates jig derives.
- Whether Maven 4's class-path and module-path distinction makes jig's resolution layer redundant for teams already on Maven.