V běžných linuxových distribucích současnosti je v součástí instalace prostředí OpenJDK JRE (Java Runtime Environment), které se letos pyšně představilo v dlouho očekávané verzi 7. Na vývojářských strojích je OpenJDK JDK – Java Development Kit.

Nebylo tomu tak ale vždy. V některých distribucích dlouho byla (a stále může být!) jako výchozí java JRE GNU classpath spolu s kompilátorem GCJ nebo předkompilovaná proprietární Sun (dnes Oracle) Java (a ta už by být nikde neměla, neboť vydáním OpenJDK 7 se naplnil závazek Sunu, že bude dodávat předkompilovanou javu do linuxových distribucí tak dlouho, dokud nebude „OpenJDK použitelné“).

Také může nastat situace, kdy je prostě potřeba javu změnit, případně nainstalovat jednu z proprietárních implementací javy. Se zorientováním, co je co a kam to vlastně patří, by vám měl pomoci tento článek.

Část 1. – Standardní balíčky javy ve Fedoře a jejich ovládání

Ve standardních repositářích Fedory jsou dnes ke stažení OpenJDK a poněkud specializovaná GNU classpath. Nicméně celý ekosystém kolem javy není zas tak jednoduchý. Často je potřeba doinstalovat nějaký ten plugin, verifikovat jeho činnost či používat více instalací javy zároveň. Ujasnit si, co se jak dělá – a jak by se to dělat mělo a jak jeto nachystané, by vám měl nastínit tento díl.

  • Historie
    • Počátky javy, plugin, GNU classpath, javaws, OpenJDK, IcedTea, Icedtea-web
    • Slovníček
    • Konvence balíčků java ve Fedora/Rhel
  • Instalace GCJ
  • Instalace OpenJDK
    • Instalace IcedTea-Web
    • Verifikace
  • Instalace proprietárních java v Rhel
  • Ovládání více nainstalovaných java
    • system-switch-java
    • alternatives

Troška historie

Pro hlubší zájemce moje přednáška z DevConf 2012: New Features in JDK8

  • 1992 – Sun odstartoval projekt Oak – budoucí javu
  • 1996 – vydáno JDK1
  • 1998 – JDK 1. 2 – představen java plugin pro spouštění aplikací (appletů) java přímo v prohlížeči
  • 2002 – vznik GNU classpath
    • Sun JDK bylo uzavřené a plně pod kontrolou korporace => nevhodné pro linuxový svět a nepřijatelné pro jeho komunitu
    • snaha implementovat všechny jeho části otevřeně – kompilátor GCJ, interpret GIJ a knihovny
  • 2002 – java webstart – nástroj ke spouštění java aplikací vzdáleně
  • 2006 – JDK 6
  • 2006 – uvolnění velkých částí JDK pro komunitu – vznik OpenJDK
  • 2007 – vznik IcdTea kolem OpenJDK
  • 2009 – IcedTea-Web – open-source plugin a javaws
    • OpenJDK obsahovalo plugin a javaws jako „proprietary blob“
    • tyto bloby byly plné (bezpečnostních) chyb
    • vytvořena otevřená náhrada IcedTea-Web
  • 2011 – OpenJDK7

Slovníček

JRE x JDK

JRE je pouze běhové prostředí, které vám umožňuje běh aplikací java. Pro jejich tvorbu a ladění potřebujete celé JDK – vývojové prostředí java. Protože JDK obsahuje vždy celé JRE, je často celá java dohromady označována jako JDK.

  • JRE – java runtime environmen – běhové prostředí java
  • JDK – java development kit – vývojové prostředí java

GNU classpath:

Že vznikla GNU classapth jako reakce open-source světa na skvělou, ale proprietární technologii je celkem zřejmé. Svět si žádal otevřenou javu, ať již pro ortodoxní uživatele, pro vývojáře, kteří chtějí jít ke zdroji, nebo jako páku proti Sunu. GNU classpath je přímočará = má překladač GCJ, interpret GIJ a běhové knihovny (žádný plugin, javaws a jiné vymoženosti/přítěže). GNU classpath verze jedna se blíží – okamžik, kdy bude plně kompatibilní s jdk5 a alespoň z 98 % kompatibilní s jdk6.

Nicméně i když je GNU classpath trošku pozadu, tak jeho páka a riziko krachu Sunu vedly k uvolnění OpenJDK.

  • Zcela otevřená implementace platformy java pod licencí GPL.
  • Obsahuje interpret GIJ a kompilátor GCJ.
  • Běhové prostředí rt.jar je tak kompatibilní, jak síly komunity stačí.
  • Více na http://www.gnu.org/software/classpath/.

OpenJDK

Fork/klon/bratr (opravdu těžko říct) Sun JDK. Přislíbeno na rok 2006, uvolněno téměř o rok později.

Nebylo tak svobodné, jak si komunita představovala:

  • chybějící části
  • binární bloby (velké kusy programů dodané pouze v přeložené podobě bez zdrojových kódů)
  • neuvěřitelně komplikovaný build

Pro koncové uživatele tak dál zůstávala jedinou šancí proprietární JDK.

IcedTea

Z důvodů výše uvedených vznikl v Red Hatu rychle po uvolnění OpenJDK projekt IcedTea s následujícími cíli:

  • nahradit bloby a chybějící části
  • usnadnit build
  • připravit OpenJDK pro distribuce
  • odchytávat bezpečnostní záplaty
  • poskytnout alternativní buildy a javy (například Shark JVM pro architekturu ARM)
  • to vše pomocí soustav buildovacích skriptů a vlastních implementací mnohých částí

Jedněmi z výše uvedených blobů byly plugin a javaws. Jejich neustálé bezpečnostní chyby a (nyní již jistá) „neotevřitelnost“ kódu vedly v roce 2009 ke vzniku IcedTea-Web.

Všechny linuxové distribuce dodávaly OpenJDK 6 předchystané pomocí IcedTea. Ovšem identifikace není povinná a některé se hlásí jako OpenJDK, jiné jako IcedTea.

S vydáním OpenJDK7, do kterého byla zahrnuta velká část IcedTea a které je již k distribucím přátelštější, ztrácí samostatný projekt OpenJDK smysl a Fedora již balí OpenJDK 7 přímo.

IcedTea-Web

Je otevřená implementace pro

  • plugin – spouštění aplikací java přímo v prohlížeči – appletů
  • javaws – spouštění aplikací java vzdáleně bez nutnosti instalace pomocí protokolu jnlp
    • například: javaws http://www.arbores.ca/Deposit.jnlp spustí vzdálenou, složitou aplikaci

Vznikl v rámci projektu IcedTea, ale dnes je samostatným projektem.

Proprietární JDK

Jsou javy s uzavřeným kódem. V současnosti si uživatel může vybrat dva majoritní dodavatele:

  • IBM java (ve verzích 1.4.2 [eol (End Of Life – konec podpory produktu) polovina 2013], 5, 6, 7)
  • Oracle java (dříve Sun java) (ve verzích 6 [eol únor2013], 7)

Otevřená JDK

Javy s otevřeným kódem. V současnosti si uživatel může vybrat (opět) dva majoritní projekty:

  • GNU classpath (ve verzích 5 a velmi brzy již i 6)
  • OpenJDK (ve verzích 6 [eol zároveň s Oracel javou], 7) + IcedTea-Web

Běžný uživatel Fedory nemusí javu řešit. Na instalačních mediích je již dlouho JRE nachystáno. Pro vývojáře i ve verzi SDK. Od Fedory 17 je zde OpenJDK7, od Fedora Core 9 to bylo OpenJDK/IcedTea 6 a v dávném pravěku, kam má paměť nesahá (Fedora Core 6?), to byla GNU classpath. Přesto mohou nastat situace, kdy je potřeba výchozí instalaci změnit nebo jinak nastavení pozměnit či rozšířit.

Konvence balíčků java ve Fedora/RHEL

Java framework se od počátku skládá z JRE – které je potřeba pro běh aplikací java, a JDK, které je potřeba pro jejich vývoj. Částečně náhodnou součástí bývá plugin a javaws. Balíčky v linuxových distribucích se snaží tuto funkcionalitu oddělit. Linuxové distribuce se také snaží oddělit zdrojové kódy a debugovací informace. Součástí názvu balíčku je také verze a dodavatel/projekt, aby mohlo být nainstalováno více platforem java zároveň:

  • java-X.Y.Z-dodavatel – balíček dodávající JRE (všechny další balíčky vyžadují JRE „svého“ projektu/verze)
  • java-X.Y.Z-dodavatel-devel – balíček dodávající JDK
  • java-X.Y.Z-dodavatel-javadoc – balíček dodávající popis API
  • java-X.Y.Z-dodavatel-src – balíček dodávající zdrojové kódy (jeho instalace může být zakázána zakomentováním repozitář zdrojových kódů v /etc/yum.repos.d/fedora.repo)
  • java-X.Y.Z-dodavatel-debuginfo – balíček dodávající informace pro ladění samotné javy (pro jeho instalaci musí být povolen (odkomentován) repozitář debuginfo v /etc/yum.repos.d/fedora.repo)

Další balíčky se mohou lišit v závislosti na verzi/projektu

  • java-X.Y.Z-dodavatel-plugin – balíček s pluginem java (javaws múže být zde nebo v JRE)
  • java-X.Y.Z-dodavatel-demo – balíček s ukázkami základních přístupů k java API
  • java-X.Y.Z-dodavatel-jdbc – balíček s ovladači rozhraní JDBC
    • balíček pro přístup k databázím
  • java-X.Y.Z-dodavatel-javafx – rozšíření s komponentami javafx
    • balíček obsahující technologii fx
  • java-X.Y.Z-dodavatel-javacomm
    • balíček obsahující komunikační API
  • java-X.Y.Z-dodavatel-accessibility – často dodáváno v nezávislých balíčcích jako java-atk-wrapper nebo java-access-bridge/java-atk-bridge
    • balíček integrující usnadňující funkce (například pro leváky, nevidomé či hendikepované osoby) operačního sytému pro aplikace java
  • yum install java-X.Y.Z-dodavatel* – vám najde/nainstaluje vše, co je pro daný projekt/verzi k dispozici. Pro vývojáře užitečné, pro uživatele často plýtvání místem.

Za názvem balíčku se nachází ještě přesná verze a architektura, čímž je svoboda instalace zajištěna. Pro Fedoru má uživatel možnosti výběru z projektů gcj (GNU classpath ve verzi 1.5.0 a brzo snad i 1.6.0) a openjdk (1.6.0 a 1.7.0). Pro supplementary kanály RHEL jsou k dispozici ještě ibm (1.4.2, 1.5.0, 1.6.0, 1.7.0) a sun (1.6.0) a jeho pokračovatel oracle (1.7.0).

Když si nebudete jistí, pamatujte, že yum install, yum search a buildovací systém Fedory koji – https://koji.fedoraproject.org/koji – jsou vaši kamarádi a vyhledávání (zástupné znaky * a ? fungují) umožňuje najít vše, co kdy kde bylo pro Fedoru zabaleno.

Pár ukázek:

  • yum search java plug-in – najde část pluginů pro javu
  • yum search openjdk "plug*" – najde všechny pluginy pro OpenJDK
  • yum install "java-1.5.0-gcj*" – nainstaluje kompletní GNU classpath
  • yum install java-1.7.0-openjdk – nainstaluje JRE pro OpenJDK6
  • Install je citlivý na velikost písmen, ale search není. Uvozovky jsou doporučeny vždy, když se používají wildcards „?“ a „*“.
  • Nezapomeňte že pro instalace musíte být root.

Instalace/Odisntalace GNU classpath

Ačkoliv si dnes prakticky neumím představit, proč by někdo instaloval pro běžný život interpret jazyka java GIJ nebo jeho kompilátor GCJ, některé balíčky jej vyžadují během buildu – snad pro jistotu, snad pro čistotu otevřeného kódu….

Instalace se provede snadno – yum install java-1.5.0-gcj* – předpokládané použití pro podezřelé vývojářské hrátky.

Je až podivuhodné, že gcj se tak nějak umí vetřít na cílový systém jako náhradní java. Většinou není potřeba a jeho odstraněním se nic neztratí (ale pravda, ani nezíská) – yum remove java-1.5.0-gcj.

Instalace OpenJDK

Pravděpodobně nejdůležitější linuxová distribuce javy, ač se instaluje snadno, má několik úskalí:

IcedTea/OpenJDK 6 pro Fedoru 14 a starší

  • yum install java-1.6.0-openjdk – nainstaluje JRE IcedTea/OpenJdk 6
  • yum install java-1.6.0-openjdk-devel – nainstaluje JDK IcedTea/OpenJDK 6 (a samozřejmě zároveň JRE)
  • yum install java-1.6.0-openjdk-plugin – java plugin a javaws
  • yum install java-1.6.0-openjdk* – vše výše uvedené včetně javadoc, src a debuginfo…

V roce 2009 byl z OpenJDK odstraněn proprietární plugin a nahrazen otevřeným projektem IcedTea-Web. Toto se promítlo od Fedory 15 dále.

IcedTea/OpenJDK 6 pro Fedoru 15 a 16

  • JRE a JDK jako výše
  • yum install icedtea-web – java plugin a javaws
  • yum install java-1.6.0-openjdk* – kompletní OpenJDK, ovšem bez pluginu a javaws.

V roce 2011 bylo vydáno OpenJDK 7. To bylo poprvé na zkoušku zabaleno pro Fedoru 16 jako java7.

OpenJDK 7 pro Fedoru 16

  • yum install java-1.7.0-openjdk – nainstaluje JRE OpenJDK 7
  • yum install java-1.7.0-openjdk-devel – nainstaluje JDK OpenJDK 7 (a samozřejmě zároveň JRE)
  • java-1.7.0-openjdk pro Fedoru 16 nemá java plugin a javaws
  • yum install java-1.7.0-openjdk* – vše výše včetně javadoc, src a debuginfo…
  • OpenJDK7 pro Fedoru 16, ač přepínatelná jako normální java, není výchozí a poskytuje java7, javac7, jre7… (přes alternatives dostupné ve verzích bez „7“, takže omezení je primárně pro buildovací systém a řešení závislostí).

Od Fedory 17 je OpenJDK 7 výchozím JDK a OpenJDK6 lze instalovat pouze manuálně.

OpenJDK 7 pro Fedoru 17 a výše

  • yum install java-1.7.0-openjdk – nainstaluje JRE OpenJDK 7
  • yum install java-1.7.0-openjdk-devel – nainstaluje JDK OpenJDK 7 (a samozřejmě zároveň JRE)
  • yum install icedtea-web – java plugin a javaws
  • yum install java-1.7.0-openjdk* – vše výše uvedené včetně javadoc, src a debuginfo a samozřejmě bez pluginu…

Verifikace

Že máte správně nainstalováno JRE (dokonce i pro gcj), ověříte snadno příkazem java -version. Výstup by měl odpovídat verzi a dodavateli. Pro JDK je kromě java -version potřeba ověřit ještě javac -version.

Chcete-li ověřit plugin, musíte pustit prohlížeč a do adresního řádku zadat about:plugin. V seznamu pluginů musí být nalezen očekávaný výsledek (icedtea-web plugin pro nejnovější Fedory). Pro javaws stačí javaws -about. Poslední ověření, které může být potřeba, je, jestli plugin opravdu funguje (což na systému, kde se javy manuálně mění, zdaleka nemusí být pravda) – k tomu je potřeba navštívit libovolnou webovou stránku s appletem java – moje oblíbená je http://www.walter-fendt.de/ph14cz/, nebo oficiální testovací stránka IcedTea web kde, ověříte i javaws – http://icedtea.classpath.org/wiki/IcedTea-Web-Tests.

Dalším zajímavým ověřením je kontrola systému souborů. Všechny javy se instalují do /usr/lib/jvm/ (dokonce i na 64bitových strojích!) a po instalaci by tam měly být pomocí alternatives kontrolované adresáře jre případně sdka samozřejmě cílový adresář odpovídající nainstalovanému balíčku. Např.: java-1.7.0-openjdk-1.7.0.9.x86_64 nebo java-1.5.0-gcj-1.5.0.0 atd.

S pluginem je život opět o něco komplikovanější. Pro java*plugin jsou binární soubory skryty uvnitř javy. Pro icedtea-web v /usr/lib(64)/IcedTeaPlugin.so. Pro obecné linkování pluginů v prohlížečích například pro 32bitový firefox ~/.mozilla/plugins/libjavaplugin.so a /usr/lib(64)/mozilla/plugins/libjavaplugin.so. Na toto téma více v druhém díle v kapitole linkování pluginů.

Instalace proprietární javy v RHEL

RHEL má (na rozdíl od Fedory) supplementary-chanel, který umožňuje instalovat proprietární software. Zde jsou k nalezení také přebalené proprietární javy Oracle a IBM:

  • yum install java-1.6.0-sun*
  • yum install java-1.7.0-oracle*
  • yum install java-1.4.2-ibm*
  • yum install java-1.5.0-ibm*
  • yum install java-1.6.0-ibm*
  • yum install java-1.7.0-ibm*

Každá přichází s (nebo bez) vlastním pluginem a náhodným zabalením (existencí) javaws (viz verifikace výše). Hlubší zkoumání proprietárních jav ale rozhodně nepatří do tohoto článku.

Ovládání více nainstalovaných jav

Pokud je v systému nainstalovaných více jav zároveň, existuje jednoduchá možnost, jak mezi nimi přepínat. Pro zkušeného uživatele a použití ve skriptech je zde systém alternatives a pro rychlé překliknutí nebo zorientování se také GUI nástroj system-switch-java.

System-switch-java

  • nainstalujeme pomocí příkazu yum install system-switch-java
  • použití je snadné: v příkazové řádce napíšeme system-switch-java (nutné být přihlášen jako root), nebo v menu konfigurace vybereme zvolenou javu (vyžádá si heslo roota)
  • přepíná zároveň java, javac i plugin (viz alternatives)
  • má GUI jak pro okenní systém X, tak pro terminál (TUI)
  • umí javy pouze přepínat – nikoliv mazat či jinak modifikovat jednotlivé záznamy

alternatives

  • jsou dostupné v každém systému již z výchozí instalace
  • pouze z příkazové řádky
  • umožňuje vypsat, odstranit, změnit, přepínat… prostě vše
  • man alternatives je k jejich použití nezbytná znalost
  • oba příkazy alternatives i update-alternatives by měly být linkem na stejnou aplikaci
  • přepnutí znamená v kontextu alternatives změnu cíle linku. Takže pokud například link java ukazoval na OpenJDK a přepne se na GCJ, pak bude ukazovat na GCJ a již ne na OpenJDK. Důkladnější prozkoumání alternatives bude v druhém díle.
    • Linky mohou ukazovat na soubory i adresáře.

Java přepíná svoje kompletní běhové prostředí (na základě rozdělení balíčků) třemi klíčovými slovy

  • java – pro přepínání uživatelských nástrojů a pro přepínání adresářů JRE (viz verifikace):
    • jre-X.Y.Z (viz konvence balíčků)
    • jre-dodavatel (viz tamtéž)
  • javac – pro přepínání vývojářských nástrojů a pro přepínání adresářů JDK (viz verifikace):
    • java-X.Y.Z (viz konvence balíčků)
    • java-dodavatel (viz tamtéž)
  • libjavaplugin.so nebo libjavaplugin.so.x86_64 pro přepínání pluginu
    • javaws je přepnuta na základě java, javac nebo libjavaplugin.so(.x86_64) podle verze a projektu
    • Pro OpenJDK od Fedory 15 (icedtea-web) se přepíná přes plugin.

Základním příkazem pro alternatives je alternatives --config java; ten nastaví všechny uživatelské nástroje a adresáře. Při rychlém zhlédnutí definice balíčku např.: http://pkgs.fedoraproject.org/cgit/java-1.7.0-openjdk.git/tree/java-1.7.0-openjdk.spec?h=f17#n1149, zjistíme, že jich je celá řada. Tento příkaz také přepne klíčový adresář /usr/lib/jvm/jre.

Základním příkazem pro JDK přes alternatives je alternatives --config javac; ten nastaví všechny vývojové nástroje a adresáře. Při rychlém zhlédnutí definice balíčku např.: http://pkgs.fedoraproject.org/cgit/java-1.7.0-openjdk.git/tree/java-1.7.0-openjdk.spec?h=f17#n1220, zjistíme, že je jich ještě více než od java (a mimo jiné /usr/lib/jvm/java a /usr/bin/java_sdk).

Přepínání adresářů JRE a java je věcí spíše specifického použití například při ladění proměnné JAVA_HOME a řídí se stejným příkazem.

Závěrem

Po přečtení tohoto článku by se měl uživatel snadno orientovat v jednotlivých javách pro Fedoru, být schopný je instalovat a konfigurovat pro nejzapeklitější situace. Také by měl rozumět konvencím, na kterých tyto balíčky stojí a jaké se využívají k provázání různých kooperujících aplikací java, a využívat je pro svůj prospěch.

V příštím díle se zaměříme na instalaci proprietárních JDK, především na nejrozšířenější Sun/Oracle javu a na jejich správnou integraci do systému.

Neváhejte se ptát v diskuzi a v případě zájmu můžu na toto téma napsat obsáhlejší či cíleněji směrované povídaní.