Archive

Posts Tagged ‘jdk7’

Actualizar a JDK7 en Linux sin romper /etc/alternatives

Como seguramente ya sabéis, debido a temas relacionados con licencias, el JDK7 de Sun (digo, Oracle) no estará incluido en los repositorios de Debian o Ubuntu. Esto no quiere decir que no se pueda instalar JDK7 en Linux, ya que puede descargarse de Sun en forma de .tgz e instalarlo.

Normalmente la instalación de los JDK se realizaba mediante el correspondiente paquete .deb. Dichos paquetes, además de instalar el JDK en sí, realizaban otra serie de operaciones, entre las que se encuentran actualizar ciertos componentes del sistema. Entre dichos componentes se encuentra /etc/alternatives, que consiste en el mantenimiento de una serie de enlaces simbólicos que permiten, en este caso, usar las herramientas del nuevo JDK sin tener que modificar los ejecutables o paths ya configurados en otras aplicaciones.

Sin embargo, al no instalarse el nuevo JDK como un paquete .deb, tendremos que actualizar el sistema  /etc/alternatives a mano.

En primer lugar, veamos el estado actual del sistema:

yo@localhost:~$ update-alternatives --list java
/usr/lib/jvm/java-6-openjdk/jre/bin/java
/usr/lib/jvm/java-6-sun/jre/bin/java

En este caso vemos las alternativas para el comando java, que consisten en la proporcionada por OpenJDK y la máquina de Sun en su versión 6. Sin embargo, el JDK no es sólo java, contiene una completa serie de utilidades. Sin  ir mas lejos, para compilar, necesitaremos javac. Veamos:

yo@localhost:~$ update-alternatives --list javac
/usr/lib/jvm/java-6-openjdk/bin/javac
/usr/lib/jvm/java-6-sun/bin/javac

Además podemos ver cuál es la versión que se usará por defecto. Por ejemplo, para javac obtenemos:

yo@localhost:~$ update-alternatives --display javac
javac - modo manual
el enlace apunta actualmente a /usr/lib/jvm/java-6-sun/bin/javac
/usr/lib/jvm/java-6-openjdk/bin/javac - prioridad 1061
esclavo javac.1.gz: /usr/lib/jvm/java-6-openjdk/man/man1/javac.1.gz
/usr/lib/jvm/java-6-sun/bin/javac - prioridad 1062
esclavo javac.1.gz: /usr/lib/jvm/java-6-sun/man/man1/javac.1.gz
Actualmente la «mejor» versión es /usr/lib/jvm/java-6-sun/bin/java.

La salida indica que el javac por defecto es el que nos proporciona el JDK6.

Como es de esperar, el sistema /etc/alternatives proporciona un interfaz para añadir nuevas alternativas. Sin embargo, un paquete como los JDK requiere actualizar muchas “alternativas” y sus “esclavas” de páginas de documentación.

Para actualizar varias máquinas, o si no quieres complicarte la vida usando /etc/alternatives directamente, puedes usar el script que proporcionamos a continuación. Se le pasa como parámetro el directorio donde has instalado el JDK7 (sin la / del final, es un poco tosco, la verdad) y genera un archivo update-alternatives, para añadir las nuevas opciones, y otro set-alternative, que las pone como valor por defecto. Echando un vistazo a estos archivos puedes hacerte una idea de la cantidad de “alternativas” que se actualizarán.

Después de ejecutarlo tu sistema debería haberse actualizado de la siguiente manera:

yo@localhost:~$ update-alternatives --list javac
/usr/lib/jvm/java-6-openjdk/bin/javac
/usr/lib/jvm/java-6-sun/bin/javac
/usr/lib/jvm/jdk1.7.0_03/bin/javac

yo@localhost:~$ update-alternatives --display javac
javac - modo manual
el enlace apunta actualmente a /usr/lib/jvm/jdk1.7.0_03/bin/javac
/usr/lib/jvm/java-6-openjdk/bin/javac - prioridad 1061
esclavo javac.1.gz: /usr/lib/jvm/java-6-openjdk/man/man1/javac.1.gz
/usr/lib/jvm/java-6-sun/bin/javac - prioridad 1062
esclavo javac.1.gz: /usr/lib/jvm/java-6-sun/man/man1/javac.1.gz
/usr/lib/jvm/jdk1.7.0_03/bin/javac - prioridad 1063
esclavo javac.1: /usr/lib/jvm/jdk1.7.0_03/man/man1/javac.1
Actualmente la «mejor» versión es /usr/lib/jvm/jdk1.7.0_03/bin/javac.

Sin mas dilación, el script. Ni que decir tiene que, como es habitual, si lo usas es por tu cuenta y riesgo, etc… En definitiva, que no nos culpes si algo sale mal 😉

#!/bin/bash

NEWDIR=$1; # without final slash please !!
LATEST=$((`update-alternatives --query java|grep Priority:|awk '{print $2}'|sort -n|tail -1`+1));

echo "Adding JDK from $1 with priority $LATEST";

BASH_FILE="update-alternatives";
UPDATE_FILE="set-alternative";

echo "#!/bin/bash" > $BASH_FILE;
echo "####" >> $BASH_FILE;
echo "####" >> $BASH_FILE;

echo "#!/bin/bash" > $UPDATE_FILE;
echo "####" >> $UPDATE_FILE;
echo "####" >> $UPDATE_FILE;
# man update-alternatives
# update-alternatives --install link name path priority [--slave link name path]...

for f in /etc/alternatives/*
do
fname=`echo $f | awk -F'/' '{print $4}' `;

CMD="update-alternatives --install /usr/bin/";
BIN="bin/$fname";
MAN="man/man1/${fname}.1";
MANGZ="man/man1/${fname}.1.gz";

if [ -f $NEWDIR/$BIN ] ; then
echo "# Adding $fname" >> $BASH_FILE;
CMD="${CMD}${fname} ${fname} $NEWDIR/$BIN $LATEST ";

echo "update-alternatives --set ${fname} $NEWDIR/$BIN">> $UPDATE_FILE;

if [ -f $NEWDIR/$MAN ] ; then
echo "# Adding slave ${fname}.1" >> $BASH_FILE;
CMD="${CMD} --slave /usr/share/$MAN ${fname}.1 $NEWDIR/$MAN";
fi

if [ -f $NEWDIR/$MANGZ ] ; then
echo "# Adding slave ${fname}.1.gz" >> $BASH_FILE;
CMD="${CMD} --slave /usr/share/$MANGZ ${fname}.1.gz $NEWDIR/$MANGZ";
fi
echo "$CMD" >> $BASH_FILE;
fi
done

exit;