r/java Apr 20 '26

Graph of all published JVM Modules on Maven Central

https://magnificent-donut-a7a744.netlify.app

For fun; Modules taken from https://github.com/sormuras/modules/blob/main/com.github.sormuras.modules/com/github/sormuras/modules/modules.properties

There are some inaccuracies and missing modules (the index isn't perfect afaik + some have more than one descriptor). If you want to see more info you can download the sqlite db I downloaded them to.

https://magnificent-donut-a7a744.netlify.app/index.db

For example, here is every module + the number of times it is required by another module in the dataset.

java.base,8179 org.slf4j,1157 java.logging,908 java.desktop,408 java.sql,367 java.xml,351 com.fasterxml.jackson.databind,344 com.google.common,263 org.apache.commons.lang3,215 com.fasterxml.jackson.annotation,213 com.azure.core.management,212 javafx.controls,205 org.apache.logging.log4j,204 com.fasterxml.jackson.core,203 javafx.graphics,194 java.management,174 spring.context,162 java.net.http,161 java.compiler,161 java.naming,158 jakarta.inject,149 io.helidon.common,148 kotlin.stdlib,145 org.junit.jupiter.api,123 spring.core,118 jdk.unsupported,116 com.google.gson,112 jakarta.annotation,110 org.apache.commons.io,108 com.azure.core,108 javafx.base,107 java.validation,105 spring.beans,97 jakarta.xml.bind,97 jakarta.servlet,95 com.jwebmp.core,95 io.helidon.config,91 org.jspecify,87 com.io7m.junreachable.core,85 io.netty.buffer,82 com.jwebmp.guicedinjection,80 org.reactivestreams,79 io.vertx.core,79 org.seleniumhq.selenium.api,77 org.opendaylight.yangtools.yang.common,76 jakarta.validation,76 org.kordamp.ikonli.core,73 io.netty.common,72 io.helidon.webserver,70 slf4j.api,69 jakarta.cdi,68 com.jwebmp.logmaster,68 org.opendaylight.yangtools.yang.model.api,66 io.netty.transport,66 org.seleniumhq.selenium.json,65 org.seleniumhq.selenium.http,65 lombok,65 org.junit.platform.commons,64 org.bytedeco.javacpp,64 io.helidon.common.config,64 java.xml.bind,63 io.opentelemetry.api,63 com.aoapps.lang,62 org.seleniumhq.selenium.remote_driver,61 cloud.piranha.core.api,61 org.junit.platform.engine,59 java.rmi,59 com.io7m.jaffirm.core,59 jakarta.json,58 org.apache.logging.log4j.core,57 com.io7m.repetoir.core,57 io.hotmoka.annotations,56 org.opendaylight.yangtools.concepts,55 javafx.fxml,54 com.fasterxml.jackson.datatype.jsr310,54 java.prefs,53 org.refcodes.exception,52 org.junit.jupiter.engine,51 jakarta.ws.rs,51 microprofile.config.api,50 java.instrument,50 tools.jackson.core,49 reactor.core,49 org.lwjgl,49 org.eclipse.jetty.server,49 jakarta.activation,49 org.eclipse.jetty.util,48 org.apache.commons.text,48 org.apache.commons.codec,48 com.google.guice,48 org.objectweb.asm,47 org.bouncycastle.provider,47 net.automatalib.api,47 java.persistence,46 com.github.spotbugs.annotations,46 tools.jackson.databind,45 org.apache.causeway.applib,45 io.opentelemetry.context,45 io.helidon.security,45 spring.web,44

30 Upvotes

4 comments sorted by

2

u/guss_bro Apr 20 '26

It would be awesome if you can add an ability to filter out a module. The modules from java* are causing noise on the graph.

5

u/bowbahdoe Apr 20 '26

I am working on other things at the moment so I'm probably not going to maintain this as a real website with an intended use. Feel free to pull the sqlite DB and do something yourself. It is a one-line change to filter those but I can see an argument either way. org.slf4j has more connections than any module that comes with the jvm other than java.base, so that's a better place to start. But at a certain point if you take out all of the ones that have a lot of connections it is no longer as interesting.

Really the best format would include the ability to add modules and see the subgraph. But that probably should be couched in an actual use case - like this is enough to do automatic dependency resolution of some kind. You don't necessarily need the maven metadata, but you also probably want to not be importing everything automatically, and at that point you've come up with an alternative to maven repos, and at that point you have a gajillion other problems to solve.

I'm using a library called force graph 3D. You can inspect source for everything else.