jueves, 22 de enero de 2015

"Instalar" Java: update-alternatives en Fedora 21

Si bien tengo ya una entrada sobre como configurar Java (Tomando como base una instalación de OpenSuSE), creí conveniente actualizarla un poco.

Lo recomendable es usar el RPM, tal como lo indica esta guía. Como sea, parece ser que el RPM no configura la alternativa, y lo que es más,  la instalación de OpenOffice ya había instalado la openJDK como dependencia, así que será necesario usar update-alternatives para no hacer un lío (Aunque tuve que hacer un lío para evitarlo).

Básicamente, los comandos a usar son estos:
update-alternatives --install /bin/java java /usr/java/default/bin/java 200 --slave /usr/share/man/man1/java.1.gz java.1.gz /usr/java/default/man/man1/java.1.gz \
--slave /bin/javaws javaws /usr/java/default/bin/javaws --slave /usr/share/man/man1/javaws.1.gz javaws.1.gz /usr/java/default/man/man1/javaws.1.gz \
--slave /bin/jcontrol jcontrol /usr/java/default/bin/jcontrol --slave /usr/share/man/man1/jcontrol.1.gz jcontrol.1.gz /usr/java/default/man/man1/jcontrol.1.gz \
--slave /bin/jjs jjs /usr/java/default/bin/jjs --slave /usr/share/man/man1/jjs.1.gz jjs.1.gz /usr/java/default/man/man1/jjs.1.gz \
--slave /bin/keytool keytool /usr/java/default/bin/keytool --slave /usr/share/man/man1/keytool.1.gz keytool.1.gz /usr/java/default/man/man1/keytool.1.gz \
--slave /bin/orbd orbd /usr/java/default/bin/orbd --slave /usr/share/man/man1/orbd.1.gz orbd.1.gz /usr/java/default/man/man1/orbd.1.gz \
--slave /bin/pack200 pack200 /usr/java/default/bin/pack200 --slave /usr/share/man/man1/pack200.1.gz pack200.1.gz /usr/java/default/man/man1/pack200.1.gz \
--slave /bin/policytool policytool /usr/java/default/bin/policytool --slave /usr/share/man/man1/policytool.1.gz policytool.1.gz /usr/java/default/man/man1/policytool.1.gz \
--slave /bin/rmid rmid /usr/java/default/bin/rmid --slave /usr/share/man/man1/rmid.1.gz rmid.1.gz /usr/java/default/man/man1/rmid.1.gz \
--slave /bin/rmiregistry rmiregistry /usr/java/default/bin/rmiregistry --slave /usr/share/man/man1/rmiregistry.1.gz rmiregistry.1.gz /usr/java/default/man/man1/rmiregistry.1.gz \
--slave /bin/servertool servertool /usr/java/default/bin/servertool --slave /usr/share/man/man1/servertool.1.gz servertool.1.gz /usr/java/default/man/man1/servertool.1.gz \
--slave /bin/tnameserv tnameserv /usr/java/default/bin/tnameserv --slave /usr/share/man/man1/tnameserv.1.gz tnameserv.1.gz /usr/java/default/man/man1/tnameserv.1.gz \
--slave /bin/unpack200 unpack200 /usr/java/default/bin/unpack200 --slave /usr/share/man/man1/unpack200.1.gz unpack200.1.gz /usr/java/default/man/man1/unpack200.1.gz

update-alternatives --install /usr/bin/javac javac /usr/java/default/bin/javac 200 --slave /usr/share/man/man1/javac.1.gz javac.1.gz /usr/java/default/man/man1/javac.1.gz \
--slave /usr/bin/appletviewer appletviewer /usr/java/default/bin/appletviewer --slave /usr/share/man/man1/appletviewer.1.gz appletviewer.1.gz /usr/java/default/man/man1/appletviewer.1.gz \
--slave /usr/bin/extcheck extcheck /usr/java/default/bin/extcheck --slave /usr/share/man/man1/extcheck.1.gz extcheck.1.gz /usr/java/default/man/man1/extcheck.1.gz \
--slave /usr/bin/idlj idlj /usr/java/default/bin/idlj --slave /usr/share/man/man1/idlj.1.gz idlj.1.gz /usr/java/default/man/man1/idlj.1.gz \
--slave /usr/bin/jar jar /usr/java/default/bin/jar --slave /usr/share/man/man1/jar.1.gz jar.1.gz /usr/java/default/man/man1/jar.1.gz \
--slave /usr/bin/jarsigner jarsigner /usr/java/default/bin/jarsigner --slave /usr/share/man/man1/jarsigner.1.gz jarsigner.1.gz /usr/java/default/man/man1/jarsigner.1.gz \
--slave /usr/bin/java-rmi.cgi java-rmi.cgi /usr/java/default/bin/java-rmi.cgi --slave /usr/share/man/man1/java-rmi.cgi.1.gz java-rmi.cgi.1.gz /usr/java/default/man/man1/java-rmi.cgi.1.gz \
--slave /usr/bin/javadoc javadoc /usr/java/default/bin/javadoc --slave /usr/share/man/man1/javadoc.1.gz javadoc.1.gz /usr/java/default/man/man1/javadoc.1.gz \
--slave /usr/bin/javafxpackager javafxpackager /usr/java/default/bin/javafxpackager --slave /usr/share/man/man1/javafxpackager.1.gz javafxpackager.1.gz /usr/java/default/man/man1/javafxpackager.1.gz \
--slave /usr/bin/javah javah /usr/java/default/bin/javah --slave /usr/share/man/man1/javah.1.gz javah.1.gz /usr/java/default/man/man1/javah.1.gz \
--slave /usr/bin/javap javap /usr/java/default/bin/javap --slave /usr/share/man/man1/javap.1.gz javap.1.gz /usr/java/default/man/man1/javap.1.gz \
--slave /usr/bin/javapackager javapackager /usr/java/default/bin/javapackager --slave /usr/share/man/man1/javapackager.1.gz javapackager.1.gz /usr/java/default/man/man1/javapackager.1.gz \
--slave /usr/bin/jcmd jcmd /usr/java/default/bin/jcmd --slave /usr/share/man/man1/jcmd.1.gz jcmd.1.gz /usr/java/default/man/man1/jcmd.1.gz \
--slave /usr/bin/jconsole jconsole /usr/java/default/bin/jconsole --slave /usr/share/man/man1/jconsole.1.gz jconsole.1.gz /usr/java/default/man/man1/jconsole.1.gz \
--slave /usr/bin/jdb jdb /usr/java/default/bin/jdb --slave /usr/share/man/man1/jdb.1.gz jdb.1.gz /usr/java/default/man/man1/jdb.1.gz \
--slave /usr/bin/jdeps jdeps /usr/java/default/bin/jdeps --slave /usr/share/man/man1/jdeps.1.gz jdeps.1.gz /usr/java/default/man/man1/jdeps.1.gz \
--slave /usr/bin/jhat jhat /usr/java/default/bin/jhat --slave /usr/share/man/man1/jhat.1.gz jhat.1.gz /usr/java/default/man/man1/jhat.1.gz \
--slave /usr/bin/jinfo jinfo /usr/java/default/bin/jinfo --slave /usr/share/man/man1/jinfo.1.gz jinfo.1.gz /usr/java/default/man/man1/jinfo.1.gz \
--slave /usr/bin/jmap jmap /usr/java/default/bin/jmap --slave /usr/share/man/man1/jmap.1.gz jmap.1.gz /usr/java/default/man/man1/jmap.1.gz \
--slave /usr/bin/jmc jmc /usr/java/default/bin/jmc --slave /usr/share/man/man1/jmc.1.gz jmc.1.gz /usr/java/default/man/man1/jmc.1.gz \
--slave /usr/bin/jmc.ini jmc.ini /usr/java/default/bin/jmc.ini --slave /usr/share/man/man1/jmc.ini.1.gz jmc.ini.1.gz /usr/java/default/man/man1/jmc.ini.1.gz \
--slave /usr/bin/jps jps /usr/java/default/bin/jps --slave /usr/share/man/man1/jps.1.gz jps.1.gz /usr/java/default/man/man1/jps.1.gz \
--slave /usr/bin/jrunscript jrunscript /usr/java/default/bin/jrunscript --slave /usr/share/man/man1/jrunscript.1.gz jrunscript.1.gz /usr/java/default/man/man1/jrunscript.1.gz \
--slave /usr/bin/jsadebugd jsadebugd /usr/java/default/bin/jsadebugd --slave /usr/share/man/man1/jsadebugd.1.gz jsadebugd.1.gz /usr/java/default/man/man1/jsadebugd.1.gz \
--slave /usr/bin/jstack jstack /usr/java/default/bin/jstack --slave /usr/share/man/man1/jstack.1.gz jstack.1.gz /usr/java/default/man/man1/jstack.1.gz \
--slave /usr/bin/jstat jstat /usr/java/default/bin/jstat --slave /usr/share/man/man1/jstat.1.gz jstat.1.gz /usr/java/default/man/man1/jstat.1.gz \
--slave /usr/bin/jstatd jstatd /usr/java/default/bin/jstatd --slave /usr/share/man/man1/jstatd.1.gz jstatd.1.gz /usr/java/default/man/man1/jstatd.1.gz \
--slave /usr/bin/jvisualvm jvisualvm /usr/java/default/bin/jvisualvm --slave /usr/share/man/man1/jvisualvm.1.gz jvisualvm.1.gz /usr/java/default/man/man1/jvisualvm.1.gz \
--slave /usr/bin/native2ascii native2ascii /usr/java/default/bin/native2ascii --slave /usr/share/man/man1/native2ascii.1.gz native2ascii.1.gz /usr/java/default/man/man1/native2ascii.1.gz \
--slave /usr/bin/rmic rmic /usr/java/default/bin/rmic --slave /usr/share/man/man1/rmic.1.gz rmic.1.gz /usr/java/default/man/man1/rmic.1.gz \
--slave /usr/bin/schemagen schemagen /usr/java/default/bin/schemagen --slave /usr/share/man/man1/schemagen.1.gz schemagen.1.gz /usr/java/default/man/man1/schemagen.1.gz \
--slave /usr/bin/serialver serialver /usr/java/default/bin/serialver --slave /usr/share/man/man1/serialver.1.gz serialver.1.gz /usr/java/default/man/man1/serialver.1.gz \
--slave /usr/bin/wsgen wsgen /usr/java/default/bin/wsgen --slave /usr/share/man/man1/wsgen.1.gz wsgen.1.gz /usr/java/default/man/man1/wsgen.1.gz \
--slave /usr/bin/wsimport wsimport /usr/java/default/bin/wsimport --slave /usr/share/man/man1/wsimport.1.gz wsimport.1.gz /usr/java/default/man/man1/wsimport.1.gz \
--slave /usr/bin/xjc xjc /usr/java/default/bin/xjc --slave /usr/share/man/man1/xjc.1.gz xjc.1.gz /usr/java/default/man/man1/xjc.1.gz  
Pero como el proceso fue tan educativo, vale la pena explicarlo un poco
  • Los script dentro del RPM de Java alojan su contenido en /usr/java/. Crea dos enlaces simbolicos: default y latest que apuntan hacia el directorio jdk<version>. 
  • Suponemos que cuando actualicemos con otro RPM, actualizará dichos enlaces simbólicos.
  • Dado lo anterior, apuntamos la dirección en el comando update-alternatives a /usr/java/default, para no tener que realizar todo este proceso con cada actualización de JDK
  •  Antes de empezar a configurar las alternativas, empaquetamos los manuales relacionados con los paquetes java.
for i in `find /usr/java/jdk1.8.0_31/man/man1/ -mindepth 1 -exec readlink -f {} +`; do gzip $i; done
  •  Para el primer comando update-alternatives, buscamos todo software que se relacione con java (JRE): se alojan en /usr/java/default/jre/bin/, pero los apuntaremos a /usr/java/default/bin/.
lista=""
for i in `find /usr/java/default/jre/bin/ -type f`; do lista="$lista `basename $i`"; done

for i in ${lista[*]}; do 
  if [[ $i = java ]]; then
    echo -e update-alternatives --install /usr/bin/java java  /usr/java/default/bin/java 200 --slave /usr/share/man/man1/java.1.gz java.1.gz /usr/java/default/man/man1/java.1.gz "\\"
  else
    echo -e --slave /usr/bin/$i $i /usr/java/default/bin/$i --slave /usr/share/man/man1/$i.1.gz $i.1.gz /usr/java/default/man/man1/$i.1.gz "\\"; 
  fi
done
Luego, buscamos en /usr/java/default/bin/ todo el software que no está en $lista, es decir, aquellos que no configuramos como esclavo de java, y que he querido suponer que son todas herramientas de desarrollo:
for j in `find /usr/java/default/bin/ -type f `; do
  i=`basename $j`
  if [[ $lista != *`basename $i`* ]]; then 
    if [[ `basename $i` = javac ]]; then
      echo -e update-alternatives --install /usr/bin/javac javac  /usr/java/default/bin/javac 200 --slave /usr/share/man/man1/javac.1.gz javac.1.gz /usr/java/default/man/man1/javac.1.gz "\\"
    else
      echo -e --slave /usr/bin/$i $i /usr/java/default/bin/$i --slave /usr/share/man/man1/$i.1.gz $i.1.gz /usr/java/default/man/man1/$i.1.gz "\\"; 
    fi
  fi
done
Casi terminado, basta con configurar la versión de java a usar:
update-alternatives --config java
Como no había otra alternativa para javac, se ha configurado automáticamente.

(1) Fuente
(2) Fuente
(3) Fuente

No hay comentarios:

Publicar un comentario

Otros apuntes interesantes

Otros apuntes interesantes