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.
| Module | Version | Scope | Why it is here |
|---|---|---|---|
| io.javalin:javalin | 6.3.0 | implementation | Serves the pages and JSON endpoints on an embedded Jetty server. |
| com.google.code.gson:gson | 2.11.0 | implementation | Converts Java objects into the JSON returned by the API. |
| org.slf4j:slf4j-simple | 2.0.16 | runtimeOnly | Logging backend. Needed to run, never referenced at compile time. |
| org.junit.jupiter:junit-jupiter | 5.11.0 | testImplementation | The test framework. Never shipped in the distribution. |
| org.junit.platform:junit-platform-launcher | 1.11.0 | testRuntimeOnly | Discovers 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.