lighty-java follows a provider-based architecture where each Java distribution (Temurin, GraalVM, Zulu, Liberica) is abstracted behind a common interface.
Key Principles
Provider Abstraction - Common API for all distributions
On-Demand Downloads - Only download when needed
Version Detection - Automatically determine required Java version
Platform Support - Cross-platform with native archive handling
Core Components
Module Responsibilities
JRE Downloader (jre_downloader.rs)
Handles downloading and installing Java runtimes:
Query distribution APIs for download URLs
Stream downloads with progress callbacks
Extract archives (ZIP for Windows, TAR.GZ for Unix)
Locate java binary in extracted directory
Set execution permissions (Unix only)
Distribution Manager (distribution/mod.rs)
Manages Java distribution providers:
Temurin: Queries Adoptium API for OpenJDK releases
GraalVM: Fetches from GitHub releases
Zulu: Queries Azul API for certified builds
Liberica: Uses Foojay API for lightweight builds
Runtime Executor (runtime.rs)
Executes Java processes with I/O streaming:
Build command-line arguments
Spawn Java process
Stream stdout/stderr in real-time
Handle process lifecycle
Version Detector (runtime.rs)
Determines required Java version for Minecraft:
Maps Minecraft version to Java version
Returns minimum required Java version
Supports all Minecraft versions from 1.7+ to latest
Data Flow
Download Flow
Execution Flow
Distribution Architecture
Each distribution implements URL building differently:
Temurin (Adoptium)
API: https://api.adoptium.net/v3/assets/
Query: Feature version, image type (JRE), OS, architecture
pub enum JreError {
Download(String), // Network or API errors
Extraction(String), // Archive extraction failures
NotFound { path }, // Binary not found after extraction
UnsupportedOS, // Platform not supported
UnsupportedVersion, // Distribution doesn't support this Java version
IO(std::io::Error), // File system errors
}