blog.stepniak.net.pl

Brudnopis programisty

Ubuntu 10.04, aktualizacja JDK 7u40

by Szymon Stępniak on 15 września 2013, no comments

Ubuntu

Przy okazji ostatniej aktualizacji JDK 7u40 opiszę dziś prosty sposób na zamianę OpenJDK na wersję dostarczaną przez Oracle w systemie Ubuntu Linux 10.04 LTS.

Do dzieła – instalacja JDK 7u40

Pierwszym krokiem przed przystąpieniem do instalacji JDK 7u40 jest pobranie właściwej dla naszego systemu i architektury sprzętowej wersji – http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html W tym przypadku interesującą mnie dystrybucją była paczka jdk-7u40-linux-x64.tar.gz Pobrany plik kopiujemy do /usr/lib/jvm i tam rozpakowujemy:

sudo tar -xvf jdk-7u40-linux-x64.tar.gz

Nasze świeżo rozpakowane jdk znajduje się w katalogu jdk1.7.0_40.
Dobrą praktyką w tym miejscu jest utworzenie linka symbolicznego, wskazującego na aktualną wersję jdk:

cd /usr/lib/jvm
sudo ln -s /usr/lib/jvm/jdk1.7.0_40 java-current

Zanim wskażemy w zmiennej środowiskowej PATH katalog bin nowego jdk, musimy usunąć stare wskazania dla plików wykonywalnych z jdk (o ile występują). Prawdopodobnie w swojej dystrybucji posiadasz zainstalowane OpenJDK – wystarczy, że instalowaliśmy za pomocą Aptitude cokolwiek wymagającego JRE lub JDK. W tej sytuacji Ubuntu stosuje następującą hierarchię:

#: which java
/usr/bin/java
#: ls -la /usr/bin/java
lrwxrwxrwx 1 root root 22 2012-06-07 21:27 /usr/bin/java -> /etc/alternatives/java
#: ls -la /etc/alternatives/java
lrwxrwxrwx 1 root root 22 2012-06-07 21:27 /etc/alternatives/java -> /usr/lib/jvm/java-7-openjdk/bin/java

Prawdopodobnie w powyższym schemacie kryje się jakaś słuszna idea, niemniej nie potrafię zrozumieć sensu istnienia dwóch pośredników pomiędzy poleceniem java a docelowym plikiem wykonywalnym. Prawdopodobnie chodziło o ułatwienie podmiany jednego linku na drugi tj. podmieniam link w /etc/alternatives/ i pociąga on za sobą zmianę w /usr/bin/. Ma to ręce i nogi, ale w przypadku jdk stanowi spore utrudnienie – jdk to nie tylko polecenie „java”, dlatego zamiast pojedynczego linkowania chcielibyśmy w tym miejscu włączyć do zmiennej PATH cały katalog bin dystrybucji jdk.

Zanim do tego przystąpimy, usuniemy wszystkie linki symboliczne z /etc/alternatives, związane z OpenJDK:

for n in `ls -la /etc/alternatives/ | grep openjdk | awk '{print $8}' | sed ':a;N;$!ba;s/\n/ /g'`; do sudo rm -fv "/etc/alternatives/$n"; done

Jeśli nie jesteśmy pewni tego kroku, możemy zrobić dumpa z bieżącymi linkami w celu ich ewentualnego później przywrócenia:

ls -la /etc/alternatives/ | grep openjdk >> openjdk_links_backup.txt

Kolejnym krokiem jest usunięcie uszkodzonych linków z /usr/bin:

sudo find -L /usr/bin/ -type l -delete

Ostatnim krokiem jest utworzenie skryptu w /etc/profile.d/ (np. /etc/profile.d/java.sh) o następującej zawartości:

export JAVA_HOME=/usr/lib/jvm/java-current
export PATH=$PATH:$JAVA_HOME/bin

Na koniec jeszcze:

source /etc/profile

i cieszymy się zaktualizowaną wersją jdk:

#:java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)