W wersji 12.04 Ubuntu można Javę 7 zainstalować dużo prościej, korzystając z repozytoriów PPA. Wystarczy dodać odpowiednie repozytorium i zainstalować Javę:
sudo apt-get update
sudo apt-get install oracle-java7-installer
Java zostanie pobrana ze strony Oracle, zainstalowana i odpowiednie powiązania zostaną automatycznie ustawione.
Więcej można przeczytać tutaj: Install Oracle Java in Ubuntu via PPA repository.
Java w wersji 7 został wydana jakiś czas temu, ale ciągle nie ma odpowiednich pakietów do instalacji w Ubuntu. Pewnie pojawią się wraz z edycją 11.10, ale czekać tak długo nie mam ochoty :).
Instalacja nowej wersji Javy sprowadza się do wykonania kilku kroków, jedyną niedogodnością jest konieczność ręcznego pilnowania nowych wydań JDK.
- Pobranie pakietu z Java, najlepiej ze strony Oracle: Java SE Development Kit 7 Downloads. Mój plik z JDK nazywa się
jdk-7-linux-x64.tar.gz
. - Rozpakować archiwum:
tar xzvf jdk-7-linux-x64.tar.gz
Zostanie utworzony katalog
jdk1.7.0
a w nim Java w wersji 7. - Przenieść rozpakowane archiwum do katalogu
/usr/lib/jvm/
pod nazwąjava-7-oracle
, gdzie znajdują się dostępne wersje JVM w systemie.Ten i pozostałe kroki muszą być wykonane z uprawnieniami użytkownikaroot
. Należy więc wcześnie zmienić konto lub używać poleceniesudo
.mv jdk1.7.0 /usr/lib/jvm/java-7-oracle - Ustawić odpowiedniego użytkownika oraz uprawnienia – właścicielem powinien być
root
a możliwość odczytu i wykonywania aplikacji powinni mieć wszyscy użytkownicy. Nie jest to krok być może konieczny, ale przy niektórych ustawianiach jego brak może uniemożliwić innym użytkownikom korzystania z Javy.chown -R root.root /usr/lib/jvm/jdk1.7.0/java-7-oracleJeżeli jednak
umask
jest ustawiony na bardziej restrykcyjną wartość (w moim przypadku007
) to pojawi się problem: zwykły użytkownik nie będzie mógł ani uruchomić ani nawet odczytać katalogu z Javą. Można to poprawić przy użyciu prostej instrukcji:chmod -R a+rX /usr/lib/jvm/java-7-oracle -
W Ubuntu domyślne implementacja Javy (jak i wielu innych aplikacji) jest ustawiana przy pomocy polecenia
update-alternatives
. Mechanizm ten pozwala na zdefiniowania wielu rożnych aplikacji dostarczających daną funkcjonalność (np. wiele wersji Javy) oraz wybranie aplikacji, która będzie uruchamiana domyślnie.W przypadku polecenia
java
można sprawdzić jakie są jego różne implementacje:# update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).
Wybór Ścieżka Priorytet Status
------------------------------------------------------------
0 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 tryb auto
1 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 tryb ręczny
* 2 /usr/lib/jvm/java-6-sun/jre/bin/java 63 tryb ręcznyW moim przypadku mam zainstalowane dwa różne JDK, z czego domyślnie ustawiona jest wersja Suna (teraz już Oracla).
Można teraz dodać implementację Java 7:
update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/jre/bin/java 3Numer
3
oznacza kolejny numer po ostatniej dostępnej wersji JVM.Teraz pozostaje tylko wydanie polecenia:
update-alternatives --config javaA teraz mały test: wywołanie poleceń
java
orazjavac
:# java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode)
# javac -version
javac 1.6.0_26Jak widać domyślnie została wywołana wersja Javy 7, natomiast wywołanie kompilator ciągle odwołuje się do wersji 6. Poradzić sobie można z tym definiując kolejną alternatywę a następnie ją ustawiając. Natomiast ilość plików binarnych które trzeba ustawić oraz stron MAN, które należy zmienić jest znaczna. Można to sprawdzić przy pomocy polecenia:
update-java-alternatives -v -l java-6-sun - Najlepszym sposobem zmiany wersji JDK w przypadku Ubuntu będzie użycie polecenia
update-java-alternatives
. Pozwoli ona na zmianę domyślnej implementacji wszystkich plików wykonywalnych oraz powiązanych z nimi stron MAN. Niestety, trzeba je odpowiednio skonfigurować, zanim zacznie działać poprawnie.Pierwszym krokiem będzie dodanie odpowiednich alternatyw dla wszystkich plików binarnych. Można to zrobić przy pomocy prostego skryptu o nazwie
update-alternatives-java-7
. Powstał on na bazie odpowiednich skryptów po instalacyjnych wykonywanych podczas instalacji OpenJDK w systemie.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77#!/bin/bash
# instalacja JRE-headless
priority=100
basedir=/usr/lib/jvm/java-7-oracle
basediralias=/usr/lib/jvm/java-7-oracle
jdiralias=java-7-oracle
mandir=/usr/lib/jvm/jdk1.7.0/man
srcext=1.gz
dstext=1.gz
jre_tools='java keytool pack200 rmid rmiregistry unpack200 orbd servertool tnameserv'
for i in $jre_tools; do
unset slave1 slave2 || true
if [ -e $mandir/man1/$i.$srcext ]; then
slave1="--slave \
/usr/share/man/man1/$i.$dstext \
$i.$dstext \
$mandir/man1/$i.$srcext"
fi
update-alternatives --verbose \
--install \
/usr/bin/$i \
$i \
$basediralias/jre/bin/$i \
$priority \
$slave1 $slave2
done
update-alternatives --verbose \
--install /usr/bin/jexec jexec $basediralias/jre/lib/jexec $priority
# instalacja JRE
jre_tools='policytool ControlPanel java_vm javaws jcontrol'
for i in $jre_tools; do
unset slave1 slave2 || true
if [ -e $mandir/man1/$i.$srcext ]; then
slave1="--slave \
/usr/share/man/man1/$i.$dstext \
$i.$dstext \
$mandir/man1/$i.$srcext"
fi
update-alternatives --verbose \
--install \
/usr/bin/$i \
$i \
$basediralias/jre/bin/$i \
$priority \
$slave1 $slave2
done
# instalacja JDK
jdk_tools='appletviewer apt extcheck idlj jar jarsigner javac javadoc javah javap jconsole jdb jhat jinfo jmap jps jrunscript jsadebugd jstack jstat jstatd native2ascii rmic schemagen serialver wsgen wsimport xjc'
for i in $jdk_tools; do
unset slave1 slave2 || true
if [ -e $mandir/man1/$i.$srcext ]; then
slave1="--slave \
/usr/share/man/man1/$i.$dstext \
$i.$dstext \
$mandir/man1/$i.$srcext"
fi
update-alternatives --verbose \
--install \
/usr/bin/$i \
$i \
$basediralias/bin/$i \
$priority \
$slave1 $slave2
doneW skrypcie należy zwrócić szczególną uwagę na definicję odpowiednich ścieżek dostępu. Po jego wykonaniu zostaną zdefiniowanie odpowiednie alternatywy dla odpowiednich plików, ale nie zostaną one jeszcze uaktywnione.
Konfiguracja
update-java-alternatives
sprowadza się do zdefiniowania odpowiedniego pliku konfiguracyjnego. Należy utworzyć (lokalizacja i nazwa pliku jest ważna) plik:/usr/lib/jvm/.java-7-oracle.jinfo
o następującej zawartości:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48name=java-7-oracle
alias=java-7-oracle
priority=100
section=non-free
jre ControlPanel /usr/lib/jvm/java-7-oracle/jre/bin/ControlPanel
jre java /usr/lib/jvm/java-7-oracle/jre/bin/java
jre java_vm /usr/lib/jvm/java-7-oracle/jre/bin/java_vm
jre javaws /usr/lib/jvm/java-7-oracle/jre/bin/javaws
jre jcontrol /usr/lib/jvm/java-7-oracle/jre/bin/jcontrol
jre keytool /usr/lib/jvm/java-7-oracle/jre/bin/keytool
jre pack200 /usr/lib/jvm/java-7-oracle/jre/bin/pack200
jre policytool /usr/lib/jvm/java-7-oracle/jre/bin/policytool
jre rmid /usr/lib/jvm/java-7-oracle/jre/bin/rmid
jre rmiregistry /usr/lib/jvm/java-7-oracle/jre/bin/rmiregistry
jre unpack200 /usr/lib/jvm/java-7-oracle/jre/bin/unpack200
jre orbd /usr/lib/jvm/java-7-oracle/jre/bin/orbd
jre servertool /usr/lib/jvm/java-7-oracle/jre/bin/servertool
jre tnameserv /usr/lib/jvm/java-7-oracle/jre/bin/tnameserv
jre jexec /usr/lib/jvm/java-7-oracle/jre/lib/jexec
jdk appletviewer /usr/lib/jvm/java-7-oracle/bin/appletviewer
jdk apt /usr/lib/jvm/java-7-oracle/bin/apt
jdk extcheck /usr/lib/jvm/java-7-oracle/bin/extcheck
jdk idlj /usr/lib/jvm/java-7-oracle/bin/idlj
jdk jar /usr/lib/jvm/java-7-oracle/bin/jar
jdk jarsigner /usr/lib/jvm/java-7-oracle/bin/jarsigner
jdk javac /usr/lib/jvm/java-7-oracle/bin/javac
jdk javadoc /usr/lib/jvm/java-7-oracle/bin/javadoc
jdk javah /usr/lib/jvm/java-7-oracle/bin/javah
jdk javap /usr/lib/jvm/java-7-oracle/bin/javap
jdk jconsole /usr/lib/jvm/java-7-oracle/bin/jconsole
jdk jdb /usr/lib/jvm/java-7-oracle/bin/jdb
jdk jhat /usr/lib/jvm/java-7-oracle/bin/jhat
jdk jinfo /usr/lib/jvm/java-7-oracle/bin/jinfo
jdk jmap /usr/lib/jvm/java-7-oracle/bin/jmap
jdk jps /usr/lib/jvm/java-7-oracle/bin/jps
jdk jrunscript /usr/lib/jvm/java-7-oracle/bin/jrunscript
jdk jsadebugd /usr/lib/jvm/java-7-oracle/bin/jsadebugd
jdk jstack /usr/lib/jvm/java-7-oracle/bin/jstack
jdk jstat /usr/lib/jvm/java-7-oracle/bin/jstat
jdk jstatd /usr/lib/jvm/java-7-oracle/bin/jstatd
jdk native2ascii /usr/lib/jvm/java-7-oracle/bin/native2ascii
jdk rmic /usr/lib/jvm/java-7-oracle/bin/rmic
jdk schemagen /usr/lib/jvm/java-7-oracle/bin/schemagen
jdk serialver /usr/lib/jvm/java-7-oracle/bin/serialver
jdk wsgen /usr/lib/jvm/java-7-oracle/bin/wsgen
jdk wsimport /usr/lib/jvm/java-7-oracle/bin/wsimport
jdk xjc /usr/lib/jvm/java-7-oracle/bin/xjcTeraz jest już dostępna nowa wersja JVM w systmie:
# update-java-alternatives -l
java-6-openjdk 1061 /usr/lib/jvm/java-6-openjdk
java-6-sun 63 /usr/lib/jvm/java-6-sun
java-7-oracle 100 /usr/lib/jvm/java-7-oraclePozostaje ustawić Jave 7 jako domyślną implementację JVM:
update-java-alternatives -v -s java-7-oracle