Dependencies

Every library this project declares, and why.

Versions live in a single catalogue file, so upgrading a library is one edit reviewed in one place. Lock files record the exact versions that were resolved, which is what keeps a build from drifting between machines.

Declared dependencies and the scope each is granted.
ModuleVersionScopeWhy it is here
io.javalin:javalin6.3.0implementationServes the pages and JSON endpoints on an embedded Jetty server.
com.google.code.gson:gson2.11.0implementationConverts Java objects into the JSON returned by the API.
org.slf4j:slf4j-simple2.0.16runtimeOnlyLogging backend. Needed to run, never referenced at compile time.
org.junit.jupiter:junit-jupiter5.11.0testImplementationThe test framework. Never shipped in the distribution.
org.junit.platform:junit-platform-launcher1.11.0testRuntimeOnlyDiscovers and launches the tests when Gradle runs the suite.

What the scopes mean

A scope decides where a library is visible. Anything marked implementation is needed to compile and to run. runtimeOnly is needed only when the program starts, so it never clutters the compile classpath. Test scopes never reach the shipped archive at all. Keeping the compile classpath small is what makes builds fast and dependencies easy to reason about.

Transitive dependencies

These five entries pull in around twenty more, mostly Jetty and the Kotlin standard library that Javalin is built on. The pipeline archives the resolved tree with every build, so what actually shipped is always recorded.