V poslední části článku o instalaci javy ve Fedoře se podíváme na využití systému alternatives.
Dynamické „přepínatelné“ linkování přes alternatives
Použití alternatives je rozhodně nejlepší volba. Jen je potřeba mít práva roota a alespoň trošku vědět, co člověk dělá. Na jejich nastavení budeme potřebovat příkaz alternatives
známý z Ovládání více nainstalovaných jav v prvním dílu. Tentokrát navíc s přepínači --install
a --remove.
Aby byla zajištěna integrace s oficiálními balíčky Fedory, je potřeba dodržovat jejich java konvence (opět viz Ovládání více nainstalovaných jav). Nezapomeňte, že alternatives
jsou téma na samostatný článek, takže to zde bude probráno jen krátce a hlavně – man alternatives
je tu pro vás.
Alternatives
je jednoduchá, ale mocná, nadstavba nad výše zmíněným systémem linků – přidává možnost měnit cíl linku (skupiny linků) na základě klíčového slova. V našem případě budou klíčová slova java
(pro JRE), javac
(pro JDK) a libjavaplugin.so
případně libjavaplugin.so.x86_64
(pro plugin a javaws)
Pro inspiraci a nekonečnou studnici vědomostí nechť slouží následující tři linky:
- http://pkgs.fedoraproject.org/cgit/java-1.7.0-openjdk.git/tree/java-1.7.0-openjdk.spec?h=f17#n1149 pro nastavení linků JRE
- http://pkgs.fedoraproject.org/cgit/java-1.7.0-openjdk.git/tree/java-1.7.0-openjdk.spec?h=f17#n1220 pro nastavení linků JDK
- http://pkgs.fedoraproject.org/cgit/icedtea-web.git/tree/icedtea-web.spec?h=f17#n135 pro nastavení linků pluginu
Přidání linků pod správu alternatives
Základním příkazem pro přidávání linků bude
alternatives --install cesta_k_cíly klíčové_slovo cesta_ke_zdroji priorita
cesta_k_cíly
– místo, kam bude výsledný link instalován. V našem případě jeden z adresářů/usr/bin
– pro spustitelné soubory (např./usr/bin/java
,/usr/bin/javac
)/usr/lib/jvm
– pro adresáře (např./usr/lib/jvm/jdk
,/usr/lib/jvm/jre
)/usr/lib(64)/mozilla/plugins/
– pro plugin (např./usr/lib(64)/mozilla/plugins/libjavaplugin.so(.x86_64)
)
Pokud již pro klíčové slovo existuje záznam, musí být cesta k cíli stejná jako u původních záznamů.
klíčové_slovo
– identifikátor určující rodinu linků a umožňující konfiguraci. Například java, javac, libjavaplugin.so(.x86_64)...cesta_ke_zdroji
– cesta ke skutečným souborům naší právě nainstalované javypriorita
– číslo, v případě naší manuální úpravy nás nemusí moc trápit. Obecně platí: čím vyšší číslo, tím vyšší prioritu má link v případě automatického zásahu (například odstranění právě používaného linku a tudíž automatický výběr náhradníka)
- Příkaz
alternatives --install /usr/bin/java java /vysledny/adresar/jdk1.7.0_XY/jre/bin/java 1
vytvoří link/usr/bin/java
směřující do/vysledny/adresar/jdk1.7.0_XY/jre/bin/java
, konfigurovatelný přes klíčové slovojava
. - Příkaz
alternatives --install /usr/bin/javac javac /vysledny/adresar/jdk1.7.0_XY/bin/javac 1
vytvoří link/usr/bin/javac
směřující do/vysledny/adresar/jdk1.7.0_XY/bin/javac
, konfigurovatelný přes klíčové slovojavac
- Příkaz
alternatives --install /usr/lib/mozilla/plugins/libjavaplugin.so libjavaplugin.so /vysledny/adresar/jdk1.7.0_XY/jre/lib/i386/libnpjp2.so 1
toto vytvoří link/usr/lib/mozilla/plugins/libjavaplugin.so
směřující do/vysledny/adresar/jdk1.7.0_XY/jre/lib/i386/libnpjp2.so
, konfigurovatelný přes klíčové slovolibjavaplugin.so na 32 bitovém stroji
- Příkaz
alternatives --install /usr/lib64/mozilla/plugins/libjavaplugin.so libjavaplugin.so.x86_64 /vysledny/adresar/jdk1.7.0_XY/jre/lib/amd64/libnpjp2.so 1
vytvoří link/usr/lib64/mozilla/plugins/libjavaplugin.so
směřující do/vysledny/adresar/jdk1.7.0_XY/jre/lib/amd64/libnpjp2.so
, konfigurovatelný přes klíčové slovolibjavaplugin.so.x86_64
Vysvětlení k linkování pluginů později. - Pokud na vašem 64bitovém stroji již byly například java-1.7.0-openjdk a icedtea-web, můžete mezi nimi snadno přepínat příkazem
alternatives --config
klíčové_slovo:
[bash]$ sudo alternatives --config libjavaplugin.so.x86_64 There are 2 programs which provide 'libjavaplugin.so.x86_64'. Selection Command ----------------------------------------------- *+ 1 /usr/lib64/IcedTeaPlugin.so 2 /vysledna/cesta/jdk1.7.0_09/jre/lib/amd64/libnpjp2.so [bash]$ java -version java version "1.7.0_b147-icedtea" OpenJDK Runtime Environment (fedora-2.1.fc17.6-x86_64) OpenJDK 64-Bit Server VM (build 22.0-b10, mixed mode) [bash]$ sudo alternatives --config java There are 2 programs which provide 'java'. Selection Command ----------------------------------------------- *+ 1 /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java 2 /vysledna/cesta/jdk1.7.0_09/jre/bin/java Enter to keep the current selection[+], or type selection number: 2 [bash]$ java -version java version "1.7.0_09" Java(TM) SE Runtime Environment (build 1.7.0_09-b05) Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode) [bash]$ sudo alternatives --config javac There are 2 programs which provide 'javac'. Selection Command ----------------------------------------------- *+ 1 /usr/lib/jvm/java-1.7.0-openjdk.x86_64/bin/javac 2 /vysledna/cesta/jdk1.7.0_09/bin/javac
Přidání celé množiny linků pod alternatives
Pokud jste poctivě studovali tři kouzelné linky na počátku této části, víte že příkazy alternatives
v nich jsou výrazně složitější. Jejich poněkud zdlouhavý zápis využívá síly příkazu alternativ
e
s
– přepínače --slave
.
Slave (otrok) umí vytvořit linky závislé na prvním linku (master link) a klíčovém slovu. Když je přepnut hlavní (master) link, přepnou se i všichni otroci (slaves). Parametr --slave
má zcela identické parametry jako --install
, jen nebere prioritu. Slabina alternatives
a slaves
je v tom, že otroci nemohou být přidáni později. RPM to řeší odstraněním a opětovným přidáním s tím, že veškeré názvy a verze jsou uloženy v svých interních proměnných. Jednoduché zkopírovat-vložit (z RPM) + nahradit (proměnné za hodnoty odpovídající vaší instalaci) z výše uvedených „magických linků“ vám může ušetřit spoustu práce. Otroky klíčového slova java
by měly být všechny spustitelné soubory z /vysledny/adresar/jdk1.7.0_XY/jre/bin
. Otroky klíčového slova javac
by měly být všechny spustitelné soubory z /vysledny/adresar/jdk1.7.0_XY/bin
. Otrokem klíčového slova libjavaplugin.so(.x86_64)
by měla být /vysledny/adresar/jdk1.7.0_XY/jre/bin/javaws
. Nevýhodou zůstává, že při manuální aktualizaci JRE musíte buď instalovat alternatives znovu, nebo použít „mezi link“ stejně jako při statickém linkování, ovšem i s jeho nevýhodami.
Par ukázek použití slaves na konec:
alternatives \ --install /usr/bin/java java /vysledna/cesta/jdk1.7.0_XY/jre/java 1 --slave /usr/lib/jvm/jre jre /vysledna/cesta/jdk1.7.0_XY/jre/ --slave /usr/bin/keytool keytool /vysledna/cesta/jdk1.7.0_XY/jre/bin/keytool --slave /usr/bin/orbd orbd /vysledna/cesta/jdk1.7.0_XY/jre/bin/orbd --slave /usr/bin/pack200 pack200 /vysledna/cesta/jdk1.7.0_XY/jre/bin/pack200 --slave /usr/bin/rmid rmid /vysledna/cesta/jdk1.7.0_XY/jre/bin/rmid --slave /usr/bin/rmiregistry rmiregistry /vysledna/cesta/jdk1.7.0_XY/jre/bin/rmiregistry --slave /usr/bin/servertool servertool /vysledna/cesta/jdk1.7.0_XY/jre/bin/servertool --slave /usr/bin/tnameserv tnameserv /vysledna/cesta/jdk1.7.0_XY/jre/bin/tnameserv --slave /usr/bin/unpack200 unpack200 /vysledna/cesta/jdk1.7.0_XY/jre/bin/unpack200; alternatives \ --install /usr/bin/javac javac /vysledna/cesta/jdk1.7.0_XY/bin/javac 1 --slave /usr/lib/jvm/java_sdk java_sdk /usr/lib/jvm/dk1.7.0_XY --slave /usr/bin/appletviewer appletviewer /vysledna/cesta/jdk1.7.0_XY/bin/appletviewer --slave /usr/bin/apt apt /vysledna/cesta/jdk1.7.0_XY/bin/apt --slave /usr/bin/extcheck extcheck /vysledna/cesta/jdk1.7.0_XY/bin/extcheck --slave /usr/bin/jar jar /vysledna/cesta/jdk1.7.0_XY/bin/jar --slave /usr/bin/jarsigner jarsigner /vysledna/cesta/jdk1.7.0_XY/bin/jarsigner --slave /usr/bin/javadoc javadoc /vysledna/cesta/jdk1.7.0_XY/bin/javadoc --slave /usr/bin/javah javah /vysledna/cesta/jdk1.7.0_XY/bin/javah --slave /usr/bin/javap javap /vysledna/cesta/jdk1.7.0_XY/bin/javap --slave /usr/bin/jconsole jconsole /vysledna/cesta/jdk1.7.0_XY/bin/jconsole --slave /usr/bin/jdb jdb /vysledna/cesta/jdk1.7.0_XY/bin/jdb --slave /usr/bin/jhat jhat /vysledna/cesta/jdk1.7.0_XY/bin/jhat --slave /usr/bin/jinfo jinfo /vysledna/cesta/jdk1.7.0_XY/bin/jinfo --slave /usr/bin/jmap jmap /vysledna/cesta/jdk1.7.0_XY/bin/jmap --slave /usr/bin/jps jps /vysledna/cesta/jdk1.7.0_XY/bin/jps --slave /usr/bin/jrunscript jrunscript /vysledna/cesta/jdk1.7.0_XY/bin/jrunscript --slave /usr/bin/jsadebugd jsadebugd /vysledna/cesta/jdk1.7.0_XY/bin/jsadebugd --slave /usr/bin/jstack jstack /vysledna/cesta/jdk1.7.0_XY/bin/jstack --slave /usr/bin/jstat jstat /vysledna/cesta/jdk1.7.0_XY/bin/jstat --slave /usr/bin/jstatd jstatd /vysledna/cesta/jdk1.7.0_XY/bin/jstatd --slave /usr/bin/native2ascii native2ascii /vysledna/cesta/jdk1.7.0_XY/bin/native2ascii --slave /usr/bin/policytool policytool /vysledna/cesta/jdk1.7.0_XY/bin/policytool --slave /usr/bin/rmic rmic /vysledna/cesta/jdk1.7.0_XY/bin/rmic --slave /usr/bin/schemagen schemagen /vysledna/cesta/jdk1.7.0_XY/bin/schemagen --slave /usr/bin/serialver serialver /vysledna/cesta/jdk1.7.0_XY/bin/serialver --slave /usr/bin/wsgen wsgen /vysledna/cesta/jdk1.7.0_XY/bin/wsgen --slave /usr/bin/wsimport wsimport /vysledna/cesta/jdk1.7.0_XY/bin/wsimport --slave /usr/bin/xjc xjc /vysledna/cesta/jdk1.7.0_XY/bin/xjc; alternatives \ --install /usr/lib64/mozilla/plugins/libjavaplugin.so libjavaplugin.so.x86_64 /vysledna/cesta/jdk1.7.0_XY/jre/lib/amd64/libnpjp2.so 1 --slave /usr/bin/javaws javaws /vysledna/cesta/jdk1.7.0_XY/jre/bin/javaws;
Poslední činnost, která bude pravděpodobně po alternatives
vyžadována, bude odstranění jedné z variant linku alternatives --remove
klíčové_slovo cesta_ke_zdroji
:
alternatives --remove java /vysledny/adresar/jdk1.7.0_XY/jre/bin/java
alternatives --remove javac /vysledny/adresar/jdk1.7.0_XY/bin/javac
alternatives --remove libjavaplugin.so /vysledny/adresar/jdk1.7.0_XY/jre/lib/i386/libnpjp2.so
neboalternatives --remove libjavaplugin.so.x86_64 /vysledny/adresar/jdk1.7.0_XY/jre/lib/amd64/libnpjp2.so 1
Manuální aktualizace a kontrola letmým pohledem
Kromě programu alternatives
může uživatel použít k úpravě linků přímo konfigurační soubory programu alternatives, které se nacházejí ve/var/lib/alternatives
. Každé klíčové slovo zde má svůj konfigurační soubor. Například /var/lib/alternatives/java.
Struktura těchto souborů je velmi jednoduchá a můžete je prohlížet/(s právy roota i) upravovat v běžném textovém editoru. Pozor, nešťastný zásah vám může rozbít alternatives
pro dané klíčové slovo natrvalo.
Struktura je následující:
- řádek 1 – identifikátor, jak má s daným klíčovým slovem alternatives zacházet – např. auto
- cesta k linku – například
/usr/bin/java
- cesty k linkům jednotlivých otroků
- jejich jména
- ....
- plná cesta k master linku první varianty
- priorita této alternativy
- cesty k jednotlivým otrokům
- další varianta
- ....
- ...
Možnosti automatického nahrazení řetězce v případě nějakého neštěstí jsou, řekl bych, celkem jasné. Například při aktualizaci z jdk1.7.0_09
na jdk1.7.0_10
nahradíte ve svém oblíbeném editoru v souborech /var/lib/alternatives/{java javac libjavaplugin.so(.x86_64)}
všechny výskyty řetězce jdk1.7.0_09
za řetězec jdk1.7.0_10.
Verifikace
Že je vše správně nastaveno, ověříme nakonfigurováním alternatives (viz Ovládání více nainstalovaných jav z prvního dílu) a prozkoušíme jako při hrátkách s OpenJDK – viz verifikace v prvním díle v kapitole – Instalace OpenJDK.
Linkování pluginů
Toto je malé vysvětlení na závěr, proč se plugin linkuje, jak se linkuje. Něco málo lze najít na:
- http://icedtea.classpath.org/wiki/IcedTea-Web#Plugin pro Openjdk (icedtea-web)
- http://www.oracle.com/technetwork/java/javase/manual-plugin-install-linux-136395.html pro Oracle java (ale nezahrnuje linkování do domovského adresáře ani pro Operu)
Teorie na pozadí je prostá, java plugin je plugin pro prohlížeč. Proto musí být uveden někde, kde ho prohlížeč najde. V Linuxu má takový adresář většina aplikací v: /usr/lib(64)/jmeno_alikace/mozna_dalsi_adresare/
a (pro možnost přizpůsobení uživatelem): ~/.jmeno_alikace/mozna_dalsi_adresare/
Proto, vzhledem k tomu, že plugin fyzicky patří jiné aplikaci, a je tudíž nainstalován u ní, o něm musíme prohlížečům říci. To se dělá pravě linkem mezi místem, kde prohlížeč plugin hledá, a místem kde se plugin skutečně existuje.
I když je prohlížečů celá řada, naštěstí většina ctí umístění pluginů podle rodiny prohlížečů Mozilla. To platí zejména pro Firefox, Chrome, Chromium, Epiphany a Midori. Linky, které můžeme využít, jsou tyto:
- Pro jediného uživatele:
~/.mozilla/plugins
- Pro všechny uživatele:
- 32bitový systém
/usr/lib/mozilla/plugins/
- 64bitový systém
/usr/lib64/mozilla/plugins/
- 32bitový systém
Jediný majoritní prohlížeč, který nectí nastavení rodiny Mozilla, je Opera:
- Pro všechny uživatele:
- 32bitový systém
/usr/lib/opera/plugins
- 64bitový systém
/usr/lib64/opera/plugins
- 32bitový systém
I když pluginy jednotlivých jav (tzn plugin pro IBM javu, plugin pro Oracle javu a plugin pro OpenJDK) nejsou většinou plně kompatibilní s jinými javami, než ke kterým patří, je až s podivem, že pracují, i když java, javac i libjavaplugin.so
ukazují každý na jinou instalaci javy. Vysvětlení je prosté – plugin si umí „svoji“ javu najít, ale stejně je lepší to nepokoušet. Pokud plugin nefunguje, může být toto linkování jedním z prvních podezřelých.
Také pozor, 64bitový plugin nebude fungovat v 32bitovém prohlížeči ani obráceně.
Závěrem
Po přečtení tohoto článku by si měl uživatel snadno vybrat a nainstalovat libovolnou proprietární javu a měl by být schopen si ji integrovat do systému bez závaznějšího rozhození.
Pokud je zájem o podrobnější instalační návody ostatních jav či další integrační zrádnosti, neváhejte se ptát v diskuzi a s troškou štěstí z toho nebude další článek.