Mostrando entradas con la etiqueta java. Mostrar todas las entradas
Mostrando entradas con la etiqueta java. Mostrar todas las entradas

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

domingo, 28 de abril de 2013

"Instalar" Java: update-alternatives

Para Open SuSE,funciona el RPM que está en el sitio de Oracle (Dicho sea de paso, la navegabilidad del sitio siempre me ha parecido disfuncional)
Se instala con un simple rpm -ivh siendo administrador.

Acá viene lo bueno: Recuerdo que alguna vez usando el RPM, al final de la instalación empezaba un script que automatizaba la tarea. O no recuerdo si fue en Fedora, pero el caso que esta última vez lo único que hizo el instalador es copiar los paquetes a una dirección concreta: /usr/java/jdk1.7.0_21/ (La cual de hecho me parece "un poco incorrecta")

La cuestión es que en esta ubicación solo podemos ejecutar los archivos con su ruta absoluta, porque no se encuentran en el PATH del sistema. Lo único que ya esta en un PATH válido es jcontrol, una utilidad para configurar monitorear la máquina virtual de java.
Si bien podriamos agregar esa ruta, desinstalar el jdk que trae por defecto y así, creo que la forma más elegante es cambiarlo con update-alternatives

Update-alternativas permite tener instalado en el sistema varios programas iguales en características (Como en este caso, dos máquinas virtuales de java), pudiendo escoger uno para tal o cual ocasión, de una manera limpia, mediante un sistema de enlaces simbólicos.
Dicho esto, lo único que necesitamos es ejecutar:
update-alternatives --install /usr/bin/java java /usr/java/jdk1.7.0_21/bin/java 200 \
--slave /usr/bin/jar jar /usr/java/jdk1.7.0_21/bin/jar \
--slave /usr/bin/jarsigner jarsigner /usr/java/jdk1.7.0_21/bin/jarsigner \
--slave /usr/bin/javadoc javadoc /usr/java/jdk1.7.0_21/bin/javadoc \
--slave /usr/bin/javah javah /usr/java/jdk1.7.0_21/bin/javah \
--slave /usr/bin/javap javap /usr/java/jdk1.7.0_21/bin/javap

Una vez hecho esto, update-alternatives --config java bastará para escoger cuál es la versión de java que usaremos: Si la que traía por defecto o la que acabamos de instalar.
La utilidad de usar la opción --slave es que creará una especie de grupo alternativa, con solo escoger java, todas las demás opciones será escogidas con él

En Open SuSE me dió error incluir javac dentro del grupo, por lo que basta con eliminarlo e incluirlo aparte

update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.7.0_21/bin/javac 10.

Como no había ninguna otra alternativa instalada, automáticamente lo escogió a él.

Basado parcialmente en How to setup up a new JDK with update-alternatives?

Otros apuntes interesantes

Otros apuntes interesantes