update-alternatives, azaz hogyan telepítsük az Oracle Java-t openSUSE 12.1 alá?

Bizony, az OpenJDK alapú IcedTea Java implementációval nem fut rendesen az abevjava, ezért letöltöttem az Oracle JDK (jdk-7u4-linux-x64.rpm) csomagját innen: http://www.oracle.com/technetwork/java/javase/downloads/index.html

Találtam egy érdekes doksit a telepítésről itt: http://www.freetechie.com/blog/installing-oracle-sun-java-1-7u1-opensus…

A doksi elolvasása után úgy döntöttem, megpróbálom egy kicsit mélyebben megérteni az update-alternatives rendszer működését. Az alternatives rendszer célja, hogy kezelje azt a szituációt, amikor egy adott feladat ellátására két vagy több különböző programcsomag van telepítve a gépre. Tipikusan ilyen helyzet az, amikor két java csomagunk van: A $PATH változó által lefedett területen található java virtuális gép (/usr/bin/java) nem bináris, csak symlink, amely a /etc/alternatives/java elérési útra mutat. A /etc/alternatives könyvtár az alternatives rendszer lelke. Ha belenézünk, láthatjuk, hogy csak symlinkek találhatók benne. Ezek a symlinkek mutatnak a kiszemelt szoftververzió által biztosított célfájlra, más szóval megválaszthatjuk, hogy az /etc/alternatives/java symlink a két telepített java bináris melyikére mutasson. Az alternatives rendszer kétszintű symlinkláncolata lehetővé teszi hát, hogy az elérési útban levő symlinket végig érintetlenül hagyjuk, amíg van programcsomag, ami ellátja az adott funkciót, és csak a /etc/alternatives könyvtáron belüli symlinkeket kell manipulálnunk, vagyis az alternatives rendszer műveletei a /etc könyvtárra korlátozódnak, ami tiszta, jól átlátható helyzetet teremt.

Megtudtam, hogy ugyanez az update-alternatives rendszer működik a legtöbb disztrón (*SuSE, Fedora, Ubuntu, Debian rendszereken biztosan), legfeljebb az a különbség, hogy a rendszer állapotadatbázisát tartalmazó ún. adminisztratív könyvtár elérési útja az RPM alapú disztrókon /var/lib/rpm/alternatives, a DEB alapúakon pedig /var/lib/dpkg/alternatives. A különböző disztrók úgy készítik a szoftvercsomagjaikat, hogy installáláskor hozzák létre a saját linkcsoportjaikat, uninstalláláskor pedig töröljék őket.

Mivel az Oracle jdk RPM csomagja nem tartalmaz ilyen update-alternatives szkripteket, a `zypper install jdk-7u4-linux-x64.rpm` parancs után a következő utasításokat adtam ki a megfelelő linkek létrehozásához:

update-alternatives --install /usr/bin/java java /usr/java/jdk1.7.0_04/bin/java 20000 \
--slave /usr/share/man/man1/java.1.gz java.1.gz /usr/java/jdk1.7.0_04/man/man1/java.1 \
--slave /usr/lib64/jvm/jre jre /usr/java/jdk1.7.0_04/jre \
--slave /usr/lib64/jvm-exports/jre jre_exports /usr/java/jdk1.7.0_04/jre/lib \
--slave /usr/bin/keytool keytool /usr/java/jdk1.7.0_04/bin/keytool \
--slave /usr/share/man/man1/keytool.1.gz keytool.1.gz /usr/java/jdk1.7.0_04/man/man1/keytool.1 \
--slave /usr/bin/orbd orbd /usr/java/jdk1.7.0_04/bin/orbd \
--slave /usr/share/man/man1/orbd.1.gz orbd.1.gz /usr/java/jdk1.7.0_04/man/man1/orbd.1 \
--slave /usr/bin/policytool policytool /usr/java/jdk1.7.0_04/bin/policytool \
--slave /usr/share/man/man1/policytool.1.gz policytool.1.gz /usr/java/jdk1.7.0_04/man/man1/policytool.1 \
--slave /usr/bin/rmid rmid /usr/java/jdk1.7.0_04/bin/rmid \
--slave /usr/share/man/man1/rmid.1.gz rmid.1.gz /usr/java/jdk1.7.0_04/man/man1/rmid.1 \
--slave /usr/bin/rmiregistry rmiregistry /usr/java/jdk1.7.0_04/bin/rmiregistry \
--slave /usr/share/man/man1/rmiregistry.1.gz rmiregistry.1.gz /usr/java/jdk1.7.0_04/man/man1/rmiregistry.1 \
--slave /usr/bin/servertool servertool /usr/java/jdk1.7.0_04/bin/servertool \
--slave /usr/share/man/man1/servertool.1.gz servertool.1.gz /usr/java/jdk1.7.0_04/man/man1/servertool.1 \
--slave /usr/bin/tnameserv tnameserv /usr/java/jdk1.7.0_04/bin/tnameserv \
--slave /usr/share/man/man1/tnameserv.1.gz tnameserv.1.gz /usr/java/jdk1.7.0_04/man/man1/tnameserv.1

update-alternatives --install /usr/lib64/browser-plugins/javaplugin.so javaplugin /usr/java/jdk1.7.0_04/jre/lib/amd64/libnpjp2.so 20001 \
--slave /usr/bin/javaws javaws /usr/java/jdk1.7.0_04/bin/javaws \
--slave /usr/share/man/man1/javaws.1 javaws.1 /usr/java/jdk1.7.0_04/man/man1/javaws.1

Vegyük észre, hogy a prioritásnak magasabbnak kell lennie a meglevő IcedTea csomag linkcsoportjaiénál, ahhoz, ahogy automata üzemmódban az Oracle Java legyen aktív, vagyis a prioritási számnak TÖBBNEK kell lennie a "gyári" java csomagokénál. Természetesen a /var/lib/rpm/alternatives könyvtárban megmaradnak azok az adatok, amelyek segítségével két rövid utasítással visszaválthatunk a szabad java-ra:

update-alternatives --set java /usr/lib64/jvm/jre-1.6.0-openjdk/bin/java
update-alternatives --set javaplugin /usr/lib64/IcedTeaPlugin.so

Ezzel ez a két linkcsoport automatikus módból kézi módba vált, mert másként nem hajlandó felülbírálni a prioritást az update-alternatives rendszer:

netadmin:~ # update-alternatives --get-selections
awk                            auto     /bin/gawk
ftp                            auto     /usr/bin/pftp
gst-install-plugins-helper     auto     /usr/lib/pk-gstreamer-install
gtk-update-icon-cache          auto     /usr/bin/gtk-update-icon-cache-3.0
java                           manual   /usr/lib64/jvm/jre-1.6.0-openjdk/bin/java
javaplugin                     manual   /usr/lib64/IcedTeaPlugin.so
jaxp_parser_impl               auto     /usr/share/java/xerces-j2.jar
jaxp_transform_impl            auto     /usr/share/java/xalan-j2.jar
jre_1.6.0                      auto     /usr/lib64/jvm/jre-1.6.0-openjdk
jre_openjdk                    auto     /usr/lib64/jvm/jre-1.6.0-openjdk
ksh                            auto     /lib64/ast/bin/ksh
mount.ntfs                     auto     /sbin/mount.ntfs-3g
netcat                         auto     /usr/bin/nc
openSUSE-default.xml           auto     /usr/share/wallpapers/openSUSE-default-static.xml
vim                            auto     /bin/vim-normal
xml-commons-apis               auto     /usr/share/java/xerces-j2-xml-apis.jar

Amint látjuk, a get-selections parancs az adott linkcsoport nevét, állapotát és a mesterlink célpontját mutatja. Az alárendelt (ún. slave) linkek nem látszanak, és a set parancsnál sem kell megadni őket, mert a mesterlink magával hozza az egész "családját".

Az aktív szoftververzióváltását a szkriptelhető set parancs helyett az interaktív config paranccsal is végezhetjük:

netadmin:~ # update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status
------------------------------------------------------------
0 /usr/java/jdk1.7.0_04/bin/java 20000 auto mode
1 /usr/java/jdk1.7.0_04/bin/java 20000 manual mode
* 2 /usr/lib64/jvm/jre-1.6.0-openjdk/bin/java 17105 manual mode

Ha eltávolítjuk a rendszerről az Oracle java csomagját, töröljük a hozzá tartozó linkcsoportokat is. A slave linkeket ezúttal sem kell megadni, törlődik az egész csoport:

update-alternatives --remove java /usr/java/jdk1.7.0_04/bin/java
update-alternatives --remove javaplugin /usr/java/jdk1.7.0_04/jre/lib/amd64/libnpjp2.so

Tehát: Az update-alternatives rendszer jó, olvassátok el a man oldalt, és használjátok úgy, ahogy kell!

Hozzászólások

Lehetek nagyon, nagyon, nagyon szemet? http://download.opensuse.org/repositories/home:/hrongyorgy/openSUSE_12… . Torold vissza az utolso elemet az utvonalbol, es hasznald egeszseggel! Amennyire tudom, rendszeresen frissitem.

Szerk: latom, kinn a 6u32, most epp le van rohadva a gepem, de hamarosan erkezik az is.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Na, most jól kicsesztél az emberiséggel ;-) (Amúgy a blogbjegyzés lényege nem is annyira a Java volt, hanem az alternatives, úgyhogy köszi a linket.) Gondolom, a te csomagjaid tartalmazzák megfelelő alternatives szkripteket. Egyébkén hogy gyártottad őket? Csak azért kérdezem, mert a http://download.opensuse.org/repositories/home:/hrongyorgy/openSUSE_12… könyvtárban mintha nem láttam volna a forrását. Miért az 1.6-os? Az 1.7-essel eddig minden kiválóan működött, amit kipróbáltam (abevjava, Brocade FC switch adminfelület, Sun ILOM virtuális konzol), meg is lepődtem rajta. Én is szeretnék ilyen build hozzáférést, csak eddig lusta voltam megcsinálni. Az xsidplay RPM-et gyártom le minden új verzióhoz már egy ideje. Nem lenne hülyeség, ha közzé tudnám tenni.

http://download.opensuse.org/repositories/home:/hrongyorgy/openSUSE_12…

Ennek nyugos a forrasterjesztese, mert nem teljesen... ooize.. nem tudom, miert, egy kategoria az acrobat readerrel.

Egyebkent meg pofatlanul csaltam. Van a regi Java:sun:Factory repo, abbol kicsekkoltam a csomagot, kicsit szogeltem rajta, kellett bele nehany csavar is, de most mar faszan buildel.

Hogy miert 1.6? Nem tudom, engem sose csigazott fel az 1.7, plusz ha barmi javasat fejlesztek, jo, ha a default compilerem 1.6, es nem kell kapcsolgatni. Illetve nekem volt par apro nyugom az 1.7-tel egy banki feluletnel, illetve a SuperMicro javas cucca is mintha kohogott volna vele (JNI-vel teltuzott szorny, utalom).

Az OBS-re baromi konnyu regelni, csak csinalni kell egy Novell-es accot. Bonuszkent kapsz egy olyan OpenID-t, ami minden Novelles cuccal hasznalhato, pl. a SUSEStudio-val is.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Na, szoval az Oracle megint tekert a dolgokon ket menetnyit. Sajnos, megszigorodott a letoltesi policy, igy nem tudok az eddig megszokott modon OBS-en keresztul Java csomagokat buildelni. Az ok: kell nekik egy idoalapon kiallitott authentikacios parameter, amit pillanatnyilag nem tudok reprodukalni.

Viszont ez nem tantorit el. Ket verzio maradt:
- Amig engedik, az OBS-re felcommittolom a fajlokat, ebbol lehet buildelni. Nem szep, es elvben szabalyba utkozik (a mar sokat emlegetett Oracle licence miatt), de jelenleg_semmit_ nem tudok tenni. Az OBS eleg laza szabalyzasu, amig nem szolnak, addig lehet.
- Megbiztok bennem annyira, hogy ha ide kirakok egy URL-t, ami egy altalam hostolt repo, akkor onnan is le fogjatok tolteni a csomagot. Ugyanezek a csomagok lennenek, csak nem az OBS gyartana oket, hanem en.

Hosszabb tavon tervezem egy sajat OBS felallitasat, ahol mar en hozom a szabalyokat, es ott pl. lehetne Android SDK-t is buildelni (ertsd: ujracsomagolni), csak az ahhoz valo gep egyreszt meg nem all rendelkezesre, masreszt azt meg ossze is kellene szogelni.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Ja, egyébként összefoglalná valaki három mondatban, hogy az Oracle Java miért nem része többé az openSUSE-nak (azt tudom, hogy licencelési okokból, de konkrétabban)? Mitől lett ekkora a különbség az Oracle és az IcedTea változat között?

Egyszeru, az Oracle tobbe nem engedi meg a Java ujracsomagolasat, csak az o csomagjukkal terjesztheto. Amit termeszetesen OEL-hez csomagolnak, es nem teljesen SUSE-konform. A DEB csomagolokrol meg sem szeretnek emlekezni.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Sziasztok!

A NAV ÁNYK-abevjava nyomtatványkitöltőjét (a legújabb, 2.49-es verziót) szeretném 12.2-re (32 bites desktop) telepíteni, nekem mindegy, hogy melyik módon, és melyik csomagból, a legegyszerűbb módszert választanám, csak működjön. Előnyben részesíteném a kattintgatást a parancssori megoldásokkal szemben.

Elolvastam ezeket is, más leírásokat is:
http://hup.hu/node/108925
http://www.nav.gov.hu/nav/ebevallas/abevjava/melyiket.html
https://sites.google.com/site/easylinuxtipsproject/java-for-opensuse
Azt hiszem, túl korán próbáltam ki egyiket vagy másikat (és nagyjából csak 12.1-hez találok útmutatást), tehát az eredmény negatív. Azt sejtem, nem távolítottam el megfelelően előzőleg mindent, amit kellett volna, mielőtt az oracle javát telepítettem, innen: http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-…. (Én még a jre-7u9-es rpm-mel próbálkoztam, de látom, már van 7u10-es.)

Szeretném az egészet elölről elkezdeni, ezért kérnék szépen egy vázlatos útmutatást kb. ezekben a kérdésekben:
1. Először miket szedjek le pontosan, a Yastban mire keressek rá?
2. Mit ne hagyjak leszedni, mit zároljak leszedés előtt a Yastban? (A LibreOffice képességeit meg szeretném őrizni, ill. a folyamat végén az újabb jre-verzióval a LO-nak is mennie kellene.)
3. Adjam-e hozzá a Yasthoz ezeket a javás repókat (melyiket?), és innen telepítsek-e az ÁNYK-nak megfelelő javát?:
http://download.opensuse.org/repositories/home:/hrongyorgy/openSUSE_12…
http://download.opensuse.org/repositories/home:/hrongyorgy/openSUSE_Fac…
vagy töltsem-e le az oracle oldaláról a legújabb jre-t, ill. esetleg egy régebbit?
4. A NAV abevjava-verziói (rpm, jar, webstartos) közül melyiket töltsem le úgy, hogy a programon belülről működjön a későbbiekben a verziófrissítés? (neten lógó gép)
5. Az elején leszedett csomagok közül melyeket kell pótlólag visszatennem ahhoz, hogy minden egyéb "a régi" módon működjön?

Előre is köszönöm szépen a segítséget! (Tudom, a kérdéseket a NAV-hoz kellene intéznem, tartok azonban tőle, hogy nem adnának konkrétan használható válaszokat... Azért lehet, hogy majd kipróbálom.)

Na, ami viszont most kiakasztott, az a HP és Brocade fibrechannels switchek java alapú management felületének letiltása az Oracle részéről. A probléma és a megoldás is megtalálható itt:

http://erwinvanlonden.net/2013/12/brocade-webtools-and-java/

Gyakorlatilag két dolgot kellett tennem a managemengt felület megnyitása előtt:

1.: Root-ként szerkeszteni az említett java.security fájlt. (Jelen esetben /usr/java/jdk1.7.0_76/jre/lib/security/java.security)
2.: A böngészőt futtató felhasználóként indítani a jcontrol programot, és a Security fülön a beállítást közepesre venni.

Ezek után kellene frissíteni a switch-ek firmware-ét.