Using multiple versions of Java in Ubuntu
I have a Ubuntu machine where I already have one JDK version which is installed. Next I have downloaded the second version into /usr/local . Now, I want to run a program against the second JDK which is in /usr/local , i.e., I will copy a sample .java program in /usr/local/bin and then execute it. But the problem is, even If I navigate to the /usr/local/bin and type $ java -version , I am getting the one which is installed in the first place. Is there any solution for this?
3 Answers 3
type sudo update-alternatives —config java
The select the version you want.
And I think this question should be moved to askubuntu.
No, the second java is not installed , that is the problem here . I just have a zip file which contains bin and other things , which I have extracted to /usr/local/java
«Below» meaning «elsewhere» such as sometimes «above» depending on votes, edit history, and the user’s preferences.
When you run java with no path, then your shell looks in your $PATH environment variable to find java . If you want a specific java , you need to either change your $PATH , or run it with a path, like:
or if you really want to cd there first, you could run
But how to compile, for eg: after cd to /usr/local/java/bin ,executing $javac sample.java will compile the extracted java or installed java version? because when I cd /usr/local/java/bin and if I type $java -version I still get the version of the one installed before
cd does not change where the shell looks for programs (except when . is in the $PATH ). You need to use a full or relative path as in my answer, or change your PATH environment variable to contain the directory first where you want java or javac (or any other executable) to be found.
Here’s an approach tested on Ubuntu 20.04 which shows adjusting the javac and java defaults:
$ sudo apt install openjdk-14-jdk $ sudo apt install openjdk-8-jdk $ java -version openjdk version "14.0.2" 2020-07-14 OpenJDK Runtime Environment (build 14.0.2+12-Ubuntu-120.04) OpenJDK 64-Bit Server VM (build 14.0.2+12-Ubuntu-120.04, mixed mode, sharing) $ javac -version javac 14.0.2 $ update-java-alternatives --list java-1.14.0-openjdk-amd64 1411 /usr/lib/jvm/java-1.14.0-openjdk-amd64 java-1.8.0-openjdk-amd64 1081 /usr/lib/jvm/java-1.8.0-openjdk-amd64 $ sudo update-alternatives --config java There are 2 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib/jvm/java-14-openjdk-amd64/bin/java 1411 auto mode 1 /usr/lib/jvm/java-14-openjdk-amd64/bin/java 1411 manual mode 2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode Press to keep the current choice[*], or type selection number: 2 update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in manual mode $ sudo update-alternatives --config javac There are 2 choices for the alternative javac (providing /usr/bin/javac). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib/jvm/java-14-openjdk-amd64/bin/javac 1411 auto mode 1 /usr/lib/jvm/java-14-openjdk-amd64/bin/javac 1411 manual mode 2 /usr/lib/jvm/java-8-openjdk-amd64/bin/javac 1081 manual mode Press to keep the current choice[*], or type selection number: 2 update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javac to provide /usr/bin/javac (javac) in manual mode $ java -version openjdk version "1.8.0_275" OpenJDK Runtime Environment (build 1.8.0_275-8u275-b01-0ubuntu1~20.04-b01) OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode) $ javac -version javac 1.8.0_275
See Switch between multiple java versions on askubuntu for a canonical thread.
Управление несколькими JDK в Mac OS, Linux и Windows WSL2
Если вам, как и мне, приходится одновременно работать с несколькими проектами (как с легаси, так и с современными), а возможно, вы разрабатываете какую-то библиотеку или утилиту для пользователей с разными версиями Java, то вы поймете проблему с переключением между разными JDK.
В наши дни установка, управление и переключение между JDK при разработке становится непростой задачей, потому что большое количество разработчиков все еще работает с Java 8, хотя многие уже переходят на Java 11. Эта проблема может быть решена разными способами. В этой статье мы рассмотрим некоторые из них.
Ручной способ
Вы можете скачать дистрибутивы с сайта вендора JDK и установить их все вручную (или просто распаковать их в какую-нибудь папку вроде $user/jdks ) и все. Но тогда вам придется каждый раз проверять и обновлять JAVA_HOME , чтобы там была нужная вам JDK.
Это можно сделать с помощью bash-скриптов, bash-функций и т. д. В чем же тогда проблема? Вы просто можете забыть вызвать скрипт / функцию и поймете, что что-то пошло не так, только когда увидите UnsupportedClassVersionError .
Если вы предпочитаете все делать вручную, то можете покопаться в интернете для поиска решений. И это может быть хорошим вариантом для продвинутых пользователей. Но я использую для этого пару утилит. Итак, давайте посмотрим на них.
Лучший способ
На мой взгляд, идеальным решением будет объединение двух open source — инструментов, которые существуют уже довольно давно, и возможно, вы знакомы, по крайней мере, с одним из них. Но что вы не знаете, так это то, что их можно использовать вместе.
Установка нескольких JDK
После установки SDKMAN! наберите:
Найдите нужного вендора, версию и введите:
Давайте установим четыре JDK: две последние версии Oracle OpenJDK и две LTS-версии AdoptOpenJDK.
При установке не выбирайте JDK по умолчанию.
- AdoptOpenJDK сборка OpenJDK 8u252 — LTS
- AdoptOpenJDK сборка OpenJDK 11.0.7 — LTS
- Oracle OpenJDK 14 — Последний GA
- Oracle OpenJDK 15 — Early Access сборка
Отлично. У вас есть четыре JDK, установленные локально с помощью SDKMAN! Я думаю, что эта утилита действительно удобна для установки JDK и, я надеюсь, она вам тоже понравилась.
Все установленные JDK можно найти в следующем каталоге:
$ cd /Users/bruno/.sdkman/candidates/java $ ls 11.0.7.hs-adpt 14.0.1-open 15.ea.20-open 8.0.252.hs-adpt
Если у вас нет необходимости часто переключаться между разными JDK, то этого будет достаточно. Вы можете использовать SDKMAN! для выбора JDK:
$ sdk current java Using java version 15.ea.19-open $ sdk default java 15.ea.20-open Default java version set to 15.ea.20-open
На этом можно остановиться и использовать только SDKMAN!, но рано или поздно, вы забудете переключить JDK точно так же как при ручном подходе. Поэтому я предпочитаю автоматическое переключение JDK.
Управление несколькими JDK с помощью jEnv
Несмотря на то что SDKMAN! удобен для установки JDK, но он не помогает при автоматическом переключении между разными JDK при переходе от одного проекта к другому. Здесь нам поможет jEnv.
После того как вы установите несколько JDK, с помощью SDKMAN! или любыми другими способами, вам нужно будет добавить их в jEnv:
$ cd ~/.sdkman/candidates/java $ ls -1 11.0.7.hs-adpt 14.0.1-open 15.ea.20-open 8.0.252.hs-adpt $ jenv add 15.ea.20-open openjdk64-15-ea added 15-ea added 15-ea added . $ jenv versions system 1.8 1.8.0.252 11.0 11.0.7 14.0 14.0.1 * 15-ea (set by /Users/bruno/.jenv/version) openjdk64-1.8.0.252 openjdk64-11.0.7 openjdk64-14.0.1 openjdk64-15-ea
Повторите команду jenv add для оставшихся трех версий JDK.
jEnv особенно удобен для тех, кто постоянно использует командную строку. Он позволит вам:
- Установить версию Java глобально для вашей системы.
- Установить версию Java для текущего каталога / проекта, в котором вы находитесь.
- Установить версию Java для текущего shell’а.
Автоматическое переключение между JDK
Теперь у вас установлены Java 8, 11, 14 и 15-EA. Итак, как же переключаться между ними? Давайте настроим версии и протестируем переключение.
Сначала нужно указать дефолтную глобальную JDK в системе. Для этого я обычно использую ранние сборки (Early Access). Всякий раз, когда я начинаю работать с новым проектом, я автоматически использую предстоящий релиз, что помогает мне выявить потенциальные проблемы, которые я могу сообщить в проект OpenJDK. Вы же тоже так делаете…
Теперь для любой папки, в которой вы находитесь, при выполнении java -version вы получите OpenJDK 15 EA.
Если у вас есть проект, который должен использовать Java 8, то перейдите в папку и запустите:
В результате будет создан файл под названием .java-version со следующим содержимым:
Этот файл сообщает jEnv, какую JDK использовать, когда вы находитесь в этой папке.
Наконец, если вы и хотите временно переключиться на другую версию JDK, то используйте jenv shell .
Здесь есть демо, которое может пояснить все вышеописанное и как работает автопереключение.
После публикации статьи на Reddit были несколько интересных комментариев, о которых стоит здесь сказать:
- SDKMAN! с версии 5.8.1+ поддерживает sdk env и там тоже доступно автоматическое переключение.
- direnv очень хорош и не привязан к java. Делает то же самое, что и jEnv, за исключением того, что не помогает вам легко переключать JDK. Вы должны редактировать файлы вручную.
- autoenv — еще одна альтернатива direnv с теми же ограничениями.
- jabba — наиболее перспективная альтернатива сочетанию SDKMAN + jEnv, поскольку поддерживает весь их функционал и работает в Windows (PowerShell), что не поддерживается другими, упомянутыми выше, инструментами.