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:

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é javy
    • priorita – čí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 1vytvoří link /usr/bin/java směřující do /vysledny/adresar/jdk1.7.0_XY/jre/bin/java, konfigurovatelný přes klíčové slovo java.
  • Příkaz alternatives --install /usr/bin/javac javac /vysledny/adresar/jdk1.7.0_XY/bin/javac 1vytvoří link /usr/bin/javac směřující do /vysledny/adresar/jdk1.7.0_XY/bin/javac, konfigurovatelný přes klíčové slovo javac
  • Příkaz alternatives --install /usr/lib/mozilla/plugins/libjavaplugin.so libjavaplugin.so /vysledny/adresar/jdk1.7.0_XY/jre/lib/i386/libnpjp2.so 1toto 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é slovo libjavaplugin.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 1vytvoří 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é slovo libjavaplugin.so.x86_64Vysvě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 alternatives – 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.sonebo
  • alternatives --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:

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/

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

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.