Практический вывод: чем закрывать каждый из трёх

Собираю всё вместе.

1. Терминал — jenv (или SDKMAN!, или что тебе ближе). Обязательно с jenv enable-plugin export, иначе первый пункт ты не закрыл, а только думаешь, что закрыл. 2. Сборка — toolchains в Gradle или Maven, зафиксированные в проекте. Единственное место, где версия принуждается, и вот почему: требование к JDK лежит в закоммиченном скрипте сборки, а билд-тул проверяет его сам, до компиляции. Не нашёл подходящую — падает: Gradle пишет No matching toolchains found for requested specification, Maven — Cannot find matching toolchain definitions. Собраться на случайной Java он в этом случае не может. .java-version и SDK в IDEA так не умеют — там договорённость, которую можно молча не соблюсти, и никто ничего не скажет. 3. IDE — Project Structure → SDK, руками, и следить, чтобы совпадало. Автоматизации тут я не нашёл.

Проверка, что всё сошлось, — три команды подряд, тридцать секунд:

jenv which java # что реально запустится в терминале echo $JAVA_HOME # что из этого увидят mvn и gradle mvn -version # или ./gradlew -version — чем собирается

И последним шагом — глазами в Project Structure. Да, глазами. Ничего лучше я пока не нашёл.

Вместо вывода

Серебряной пули не вышло. Вышел узкий инструмент, который честно делает свою треть работы, — при условии, что ты знаешь про export-плагин и не ждёшь, что он поставит тебе Java.

А самое ценное для меня оказалось не в утилите, а в том, что она заставила меня разложить по полочкам вещь, которой я много лет пользовался на автомате. Погружение в технику до руды, так сказать.

Всем добра!