28 марта 2016 г.

Установка Java Development Kit в Linux из архива tar.gz

Данный пост, это просто обновление поста 2010 года, который до сих пор пользуется довольно большой популярностью, а так как с тех времен уже немало воды утекло, то я посчитал своим долгом актуализировать эту информацию. По пути также кое-что было переработано, надеюсь, в сторону понятности.
Если вам потребовался стандартный JDK от Oracle, вместо OpenJDK, который поставляется с современными свободными дистрибутивами Linux, то его можно скачать либо с дополнительных сторонних репозиториев для вашего дистрибутива, либо напрямую с сайта www.oracle.com. Если ставить Java из репозиториев для вашего дистрибутива, то скорее всего всё само настроется и заработает, и ни о чем беспокоится вам не придется, но если вы скачали JDK или JRE в виде архива tar.gz с сайта Oracle, придется совершить несколько дополнительных телодвижений.

На данный момент скачать JDK с сайта Oracle можно в двух видах: это RPM-пакет и вышеупомянутый архив tar.gz. Про то, на сколько удачно ставится JDK из RPM-пакета, мне сказать нечего - не пробовал. Я предпочитаю устанавливать JDK именно из архива, потому что так я получаю полное управление и понимание того, что и откуда у меня будет запускаться, а также универсальное решение, которое подойдет для всех дистрибутивов, а не только для RPM-based.

План действий
  1. Скачать нужную версию JDK (архив tar.gz)
  2. Распаковать архив
  3. Настроить переменные окружения
  4. Настроить update-alternatives
Куда распаковать?

Итак, скачали JDK. Распаковываем. Но куда? Вроде бы тупой вопрос, но я далеко не сразу пришёл к правильному  для себя  решению. Сейчас я все JDK распаковываю в каталог /usr/local/lib64 и там у меня одновременно живёт несколько версий JDK. Например, на данный момент, там у меня есть каталоги jdk1.7.0_79 и jdk1.8.0_77. В дополнение к этим каталогам, в /usr/local/lib64 у меня находится симлинк с именем jdk, который сегодня чаще всего указывает на каталог jdk1.8.0_77. К такой конфигурации я пришел, когда потребовалось периодически переключаться между различными версиями JDK, причем переключаться нужно было глобально во всей системе. Каким образом такая конфигурация помогает переключаться между версиями, станет понятно ниже.

Переменные окружения

Простой распаковки файлов JDK недостаточно для того, чтобы можно было нормально использовать установленный JDK по умолчанию в системе. Следующим шагом необходимо настроить переменные окружения. Для настройки глобальных переменных окружения в Linux используются специальные конфигурационные файлы, обычно это /etc/profile (в OpenSUSE предпочтительнее /etc/profile.local ).

Ниже приведен пример настройки моих переменных окружения для JDK:

JAVA_HOME=/usr/local/lib64/jdk
JRE_HOME=$JAVA_HOME/jre
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME JRE_HOME PATH

Как можно заметить, переменная JAVA_HOME ссылается у меня не на конкретный реальный каталог с JDK, а на симлинк. Удобство этого подхода для меня заключается в том, что я могу переключать глобальный JDK по умолчанию, просто поменяв симлинк на каталог с JDK необходимой версии.

Примечания:
  • В некоторых особых случая, возможно, понадобится добавить эти же строки в файл /etc/bashrc SUSE /etc/bash.bashrc.local), который читается bash'ем, если он запущен без параметра --login
  • В дистрибутивах SUSE для установки глобальных переменных окружения по умолчанию следует использовать файлы /etc/profile.local и /etc/bash.bashrc.local, потому что после апгрейда системы, файлы /etc/profile и /etc/bash.bashrc могут быть перезаписаны. Если таких файлов нет, то необходимо их создать. Также, вместо использования файла /etc/profile.local, в каталоге  /etc/profile.d можно создать отдельный bash-скрипт, с командами для настройки окружения JDK. В этом случае, при создании скрипта, важно не пересечься с именами скриптов, которые могут быть созданы системой в этом же каталоге в будущем при установке каких-либо пакетов.
  • Я не знаю аналога /etc/profile.local в дистрибутивах Ubuntu, поэтому могу порекомендовать использовать каталог /etc/profile.d.
  • Переменная JRE_HOME может быть и не особо нужна, но я часто встречаю её в современных дистрибутивах, поэтому на всякий случай можно её установить - вдруг она понадобится какой-нибудь странной программе :)
После изменения файла /etc/profile (или других подобных файлов, см. примечания выше), необходимо перезайти в систему. В консоле можно проверить правильно ли установлены значения переменных:

$ set |grep JAVA_HOME
JAVA_HOME=/usr/local/lib64/jdk
$ set |grep ^PATH
PATH=/usr/local/lib64/jdk/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11

Теперь проверяем версию Java:

$ java -version
java version "1.8.0_77"

В принципе это всё и уже по умолчанию в системе будет использоваться Oracle JDK вместо OpenJDK. Но в современных дистрибутивах лучше выполнить ещё одну настройку, о которой написано ниже.

Настройка update-alternatives

На самом деле, переменную PATH можно было и не менять. Сегодня в дистрибутивах Linux установка среды выполнения Java по умолчанию осуществляется с помощью утилиты update-alternatives.  Кратко опишу принцип её работы на моем примере с java. 

В каталоге альтернатив /etc/alternatives есть символическая ссылка java, которая указывает на настоящий файл java, расположенный где-то в файловой системе. В каталоге /usr/bin есть символическая ссылка, которая указывает на ссылку /etc/alternatives/java. Таким образом, для всех пользователей и программ, которые вызывают java на самом деле доступна ссылка /usr/bin/java которая ссылается на реальную программу java через ссылку /etc/alternatives/java. Утилита update-alternatives служит для переключения символической ссылки /etc/alternatives/java на различные версии java, установленные в системе, а все пользователи либо программы как использовали ссылку /usr/bin/java для вызова java, так и будут продолжать её использовать.

Посмотрим, какие установленные версии java доступны для /etc/alternatives/java в моем случае c помощью параметра --list, для этого программе update-alternatives также необходимо указать имя ссылки в каталоге  /etc/alternatives:

# update-alternatives --list java
/usr/lib64/jvm/jre-1.7.0-openjdk/bin/java
/usr/lib64/jvm/jre-1.8.0-openjdk/bin/java

Используя параметр  --config можно посмотреть доступные альтернативы для java, а потом выбрать нужную в интерактивном режиме:

# update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                       Priority   Status
------------------------------------------------------------
* 0            /usr/lib64/jvm/jre-1.8.0-openjdk/bin/java   1805      auto mode
  1            /usr/lib64/jvm/jre-1.7.0-openjdk/bin/java   1705      manual mode
  2            /usr/lib64/jvm/jre-1.8.0-openjdk/bin/java   1805      manual mode

Press enter to keep the current choice[*], or type selection number:

Приведу теперь простую и понятную схему ссылок, которая используется на данный момент в моей системе:

/usr/bin/java -> /etc/alternatives/java -> /usr/lib64/jvm/jre-1.8.0-openjdk/bin/java

Итак, как стало ясно, в моем случае доступно две альтернативы для java, это OpenJDK 1.7 и OpenJDK 1.8, и сейчас update-alternatives настроены на использование OpenJDK 1.8. Для того, чтобы добавить альтернативную версию java, необходимо использовать параметр --install и указать следующее:
  1. Главную ссылку, которая будет ссылаться на символическую ссылку в /etc/alternatives (для моего случая это /bin/usr/java)
  2. Имя ссылки в каталоге /etc/alternatives (в данном случае java)
  3. Альтернативу для этой ссылки, т.е. местоположение самой программы ( /usr/local/lib64/jdk/bin/java)
  4. Приоритет для этой альтернативы. Приоритет необходим для автоматического выбора альтернативы при включении automatic mode (будет выбрана альтернатива с наибольшим приоритетом).
Устанавливаем новую альтернативу:

# update-alternatives --install /usr/bin/java java /usr/local/lib64/jdk/bin/java 10000
update-alternatives: using /usr/local/lib64/jdk/bin/java to provide /usr/bin/java (java) in auto mode

Из сообщения понятно, что теперь у нас установлена новая альтернатива для java, а update-alternatives автоматически переключилась на неё, т. к. при установке мы использовали значение приоритета более высокое, чем у двух альтернатив, которые были настроены в системе ранее.

Посмотрим, что доступно теперь:

# update-alternatives --list java/usr/lib64/jvm/jre-1.7.0-openjdk/bin/java
/usr/lib64/jvm/jre-1.8.0-openjdk/bin/java
/usr/local/lib64/jdk/bin/java

После установки новой альтернативы видим, что в списке появилась альтернатива /usr/local/lib64/jdk/bin/java.

Теперь, если нам необходимо переключиться на какую-либо из доступных альтернатив, можно использовать параметр  --config:

# update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                       Priority   Status
------------------------------------------------------------
* 0            /usr/local/lib64/jdk/bin/java               10000     auto mode
  1            /usr/lib64/jvm/jre-1.7.0-openjdk/bin/java   1705      manual mode
  2            /usr/lib64/jvm/jre-1.8.0-openjdk/bin/java   1805      manual mode
  3            /usr/local/lib64/jdk/bin/java               10000     manual mode

Press enter to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib64/jvm/jre-1.7.0-openjdk/bin/java to provide /usr/bin/java (java) in manual mode


Ручное переключение на альтернативу отключило automatic mode. Теперь при добавлении еще одной версии java в альтернативы автоматического переключения не произойдет. Для включения automatic mode снова, нужно ввести 0 при использовании --config java.

Примечания:
  • Важно понимать, что с помощью update-alternatives настраивается только ссылка на исполняемый файл java, а переменная окружения JAVA_HOME остаётся неизменной. Т. к. многим программам может потребоваться корректно установленная переменная JAVA_HOME, то для интеграции Oracle JDK в систему, необходимо использовать комплексный подход, заключающийся в настройках переменных окружения и update-alternatives.
  • Да, update-alternatives можно использовать и для настройки альтернатив каталога с jdk, вместо приведенного в статье варианта ручного управления симлинком /usr/local/lib64/jdk, но по-моему, при добавлении новой версии jdk, гораздо проще поменять руками собственный симлинк, чем запоминать параметры команды update-alternatives для установки новой альтернативы.
  • При использовании --config, символ "*" показывает какая альтернатива сейчас используется.
  • Если вы руками измените значение ссылок /etc/alternatives/java или /usr/bin/java, то скорее всего при перезагрузке эти значения вернутся в состояние которое описано утилитой update-alternatives.
  • Каталог альтернатив /etc/alternatives является каталогом по умолчанию и может быть изменен командой update-alternatives --altdir.
  • Утилиту update-alternatives можно использовать также для создания своих собственных групп альтернатив.
После настройки update-alternatives можно удалить строку в файле /etc/profile, которая добавляет в переменную окружения PATH путь к директории $JAVA_HOME/bin, если, конечно, вам не нужны в глобальном пространстве другие программы из этого каталога (вроде javac и jvisualvm), и перезайти в систему. После этого вы будете использовать java из Oracle JDK по привычной ссылке /usr/bin/java.

8 комментариев:

  1. у меня в Win 7 следующая проблема

    \bin\java - системе не удается найти указанный путь

    я не могу настроить переменную окружения для java
    может есть какие-нибудь идеи по этому поводу?

    ОтветитьУдалить
  2. Можно попробовать добавить в переменную окружения PATH следующий путь: [Каталог с JDK или JRE]\bin

    Я не пользуюсь Windows 7, но там вроде бы так же как и в XP переменные окружения можно отредактировать зайдя в Мой компьютер -> Свойства -> Дополнительно -> Переменные среды

    А еще проще можно попробовать переустановить JDK.

    ОтветитьУдалить
  3. да. я на ХР тоже редактировал переменную окружения PATH и на Win 7 она редактируется. Но вот в чем дело. Все равно не работает. В ХР набрав в ком. строке JAVA, она моментально включалась, а в семерке не проходит. Поэтому я и обратился за помощью к Вам. Может не хватает всего лишь отредактировать PATH?

    ОтветитьУдалить
  4. Ну тогда, к сожалению, ничем помочь больше не могу. Я и по винде не специалист и на 7-ку вообще Java ни разу не ставил. Статья всё-таки про Linux :)

    Если это проблема с Java + Win7 встречается не только у вас, то решение проблемы должно быть в Google, а если нет, то что тут сказать Windows... Я не очень представляю как там всё у неё происходит, но в моем понимании установки пути к jdk\bin в переменной PATH должно хватать для того что бы запускать java.exe без указания полного пути. Win7 у меня нет, проверить не могу.

    Вы в командной строке еще с помощью команды set (наверное есть такая) проверьте установилось ли значение переменной PATH как вы указали.

    ОтветитьУдалить
  5. Да и кстати в винде то вообще не должно быть никаких лишних телодвижений при установке, о чем тут говорить... Что-то где-то поломалось у вас скорее всего. Последнюю же версию Java ставите?

    Скопируйте прямо сюда то, что вы пишите в командной строке и то, что там в ответ происходит.

    ОтветитьУдалить
  6. теперь в командной строке Java обнаруживается, но при запуске приложения в JDevelopere пишит след.:
    JAVA Memory arguments:
    .
    WLS Start Mode=Development
    .
    CLASSPATH=
    .
    PATH=D:\oracle\product\10.2.0\db_1\bin;C:\Program Files\NVIDIA Corporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\Oracle\Middleware\jdk160_18\bin
    .
    ***************************************************
    * To start WebLogic Server, use a username and *
    * password assigned to an admin-level user. For *
    * server administration, use the WebLogic Server *
    * console at http:\\hostname:port\console *
    ***************************************************
    starting weblogic with Java version:
    ‘Ёб⥬Ґ ­Ґ г¤ Ґвбп ­ ©вЁ гЄ § ­­л© Їгвм.
    Starting WLS with line:
    \bin\java -Dweblogic.Name= -Djava.security.policy=\server\lib\weblogic.policy -Djavax.net.ssl.trustStore=D:\Oracle\Middleware\wlserver_10.3\server\lib\DemoTrust.jks -Dweblogic.nodemanager.ServiceEnabled=true
    ‘Ёб⥬Ґ ­Ґ г¤ Ґвбп ­ ©вЁ гЄ § ­­л© Їгвм.
    Process exited.



    Расшифровал иероглифы - "системе не удается найти указанный путь"

    ОтветитьУдалить
  7. Ну это уже вопрос установки не Java, а JDeveloper... тут мне уже трудно телепатить, слишком много неизвестных в лице Windows 7 и JDeveloper, ни того ни другого не использую, пробуйте спрашивать на форумах и почитать документацию: http://www.oracle.com/technetwork/developer-tools/jdev/documentation/index.html

    Вот здесь именно про установку:

    http://download.oracle.com/docs/cd/E14571_01/install.1111/e13666/ojdig.htm

    Еще можно посоветовать вам поставить самый свежий JDK и попробовать скачать и установить версию Java Edition:

    http://download.oracle.com/docs/cd/E14571_01/install.1111/e13666/ojdig.htm#BDCIGGFJ

    Или в вашей установленной версии указать для использования другой более новый JDK:

    http://download.oracle.com/docs/cd/E14571_01/install.1111/e13666/ojdig.htm#BDCFBDAC

    Удачи!

    ОтветитьУдалить
  8. >> у меня в Win 7 следующая проблема
    >>\bin\java - системе не удается найти указанный путь

    Проверьте что Вы устанавливаете: возможно вы устанавливаете не jdk, а jre. Сам немного программирую в Java как на linux, так и в Windows. В последней ОС проблем с Java не возникало. Eclipse, например автоматически определяет установлена ли jdk у вас в ОС или нет.

    ОтветитьУдалить