11 releases

0.3.0 Oct 15, 2024
0.2.9 Sep 25, 2021
0.2.8 Jul 30, 2021
0.2.7 Mar 20, 2021
0.1.0 Sep 27, 2020

#70 in Build Utils

AGPL-3.0-or-later

87KB
2K SLoC

java-preloader-reloadeder

Crates.io

Replacement for my old gist.

Downloads JDKs from foojay DiscoAPI and stores them in <cache dir>/jpre/jdks. <cache dir> is based on directories.

Preferred distribution can be set in the config (also directories-based), defaults to temurin.

Installation

Run cargo install jpre to get the jpre binary.

Then, do the following (or similar) in your shell's startup script:

# This may be necessary to ensure the context is understood everywhere
export JPRE_CONTEXT_ID="$(jpre get-context-id)"
# Sets the Java home to the jpre-managed location. This will be symlinked to the currently active JDK.
export JAVA_HOME="$(jpre java-home)"
# Puts the binaries on your path
export PATH="$JAVA_HOME/bin:$PATH"
# Potentially optional, forces shell to re-scan for `java` et. al
hash -r

Note that if you do not set a default JDK (with jpre default), the symlinked path will lead nowhere!

Usage

Run e.g. jpre use 17, this downloads Temurin JDK 17 and makes it the active JDK. Other major versions can be downloaded and configured using jpre use <major>. The default JDK can be set using jpre default <major>.

Full details are available by running jpre help.

How it works

jpre uses the parent process ID as a key to determine the symlink location. This makes it work per-shell (or other process) and not interfere with other sessions. The symlink is in the jpre cache directory and is updated every time a JDK is selected.

In order to prevent cross-session pollution, java-home clears any existing symlink before creating a new one.

Dependencies

~20–32MB
~506K SLoC