domingo, 9 de marzo de 2014

Remover OpenJDK 6 e instalar el JDK de Oracle en Debian

Vamos con un post relacionado a la programación, y esta vez con Android.

Quiero divertirme jugando un poco con el ADT bundle en Debian Squeeze, pero al descomprimirlo y hacer doble clic me aparece un mensaje de error:


Esto se debe a que Debian Squeeze viene con el OpenJDK 6 instalado y lo trae predeterminado.

Intentando solucionar el problema que presenta por la versión antigua (dado que funciona con la JVM versión 1.6 o mayor), procedí a la descarga del JDK de Oracle más reciente que lo encontré aquí, y está en su revisión 7 update 51 hasta la fecha (10/03/2014).

Una vez hayamos aceptado la licencia y también ya tengamos descargado el paquete (rpm para distros basadas en RedHat, y .tar.gz para las distros basadas en Debian), lo descomprimimos en el directorio que lo guardamos (la tarea de descomprimir se puede hacer en el entorno fráfico con un usuario sin privilegios), y luego lo movemos (en la línea de comandos como usuario root) a la carpeta /opt

#cd /ruta/al/archivo/descargado/jdk-7u<version>-x86_x64.tar.gz
#mv jdk-7u<version> /opt

Una vez se haya movido el contenido en la carpeta /opt procedemos a crear un enlace simbólico dentro de la carpeta /usr/lib/jvm en mi caso ya se encontraba esa carpeta donde hay enlaces hacia la versión antigua de paquetes relacionados a java y OpenJDK, pero si no existe la carpeta habrá que crearla y movernos dentro de ella.

En caso que no exista dicha carpeta se creará y se accederá a ella con ejecutar:

#mkdir /usr/lib/jvm
#cd /usr/lib/jvm

Una vez dentro, el enlace simbólico que se crea se hace de la siguiente manera:

#ln -s /opt/jdk-7u<version> java-7-oracle

Lo que hace esta secuencia de órdenes es crear un enlace de tipo "suave" o simbólico (ln -s) desde la carpeta que contiene los nuevos binarios (/opt/jdk-7u<version>) hacia una carpeta dentro de /usr/lib/jvm que se creará en ese momento (java-7-oracle). El enlace simbólico creado tendrá la siguiente ruta: /usr/lib/jvm/java-7-oracle

Esa ruta es la que utilizarán todas las configuraciones que hagan uso del binario java, con el propósito que cuando te actualices a una versión más nueva del JDK de Oracle solamente modifiques el enlace simbólico hacia la nueva carpeta que tiene los binarios más recientes y todas las demás configuraciones queden funcionales de forma transparente.

Ahora vamos a definir la variable de entorno donde se encuentran los binarios que deseamos que utilicen nuestros programas que harán uso de java (/usr/bin/java).

Para definir la variable de entorno vamos a editar el archivo /etc/bash.bashrc como root y con nuestro editor favorito.

En mi caso: #nano /etc/bash.bashrc  y agregué al final:

JAVA_HOME=/usr/lib/jvm/java-7-oracle
export PATH=$PATH:$JAVA_HOME/bin


y aunque se haya instalado una versión nueva del JDK de Oracle (y su variable de entorno configurada) siempre resulta en el mismo mensaje de error.

Para solucionar esto, tenemos que echar mano de "update-alternatives" que en caso de existir dos o más versiones de un mismo programa nos permite elegir cual queremos dejar predeterminado para que funcione con nuestras aplicaciones.

Vamos desde el principio, debemos quitar el OpenJdk 6 que viene por defecto en Debian.

#apt-get remove openjdk-6-jre default-jre default-jre-headless

En otros sitios sugieren hacerlo de esta forma:

#apt-get purge openjdk-* icedtea-* icedtea6-*  (ser cuidadoso con lo que se borra!)

Aunque eliminados estos paquetes, y habiendo copiado en /opt la versión más reciente del JDK de Oracle, al ejecutar en una consola "java --version" siempre aparece una anitigua version en remanente:

java version "1.5.0"
gij (GNU libgcj) version 4.4.5

Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
.



Esto se soluciona poniendo nuestra instalación reciente como primer alternativa, y se hace de esta forma:

#update-alternatives --install nombre_genérico ruta/al/programa prioridad

update-alternatives --install: Determinado la instalación de un nuevo paquete dentro de /etc/alternatives/
 
nombre_genérico: (/usr/bin/java java)

ruta/al/programa: (/opt/jdk1.7.0_51)

prioridad: 1

#update-alternatives --install /usr/bin/java java /opt/jdk1.7.0_51 1 

Después de instalado procedemos a configurarlo siempre con update-alternatives:

#update-alternatives --config java
Existen 2 opciones para la alternativa java (que provee /usr/bin/java).

  Selección   Ruta                              Prioridad  Estado
-------------------------------------------------------------------------------------
*0            /usr/bin/gij-4.4                    1044          modo automático
 1            /opt/jdk1.7.0_51/bin/java    1                modo manual
 2            /usr/bin/gij-4.4                     1044          modo manual

Pulse <Intro> para mantener el valor por omisión [*] o pulse un número de selección: 1
(al presionar "1" que es la alternativa que quiero establecer como prioridad, aparece el siguiente mensaje...)

update-alternatives: utilizando /opt/jdk1.7.0_51/bin/java para proveer /usr/bin/java (java) en modo manual.

Una vez que establecimos el paquete que hará referencia cuando se invoque a /usr/bin/java, procedemos a comprobar la versión que se está utilizando del JDK. Cerramos las ventanas de línea de comandos que tengamos abierta y ejecutamos:

$which java:
/usr/bin/java

$java --version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)


Ahora sí, al ejecutar el ADT bundle nos aparece:



Más información sobre update-alternatives en Debian.
Otro post explicativo sobre update-alternatives.
De este otro post obtuve mucha información útil, prácticamente la base.
Obteniendo más información para eliminar OpenJDK y OpenJRE.
Más información de cómo eliminar OpenJDK.
Este post de cómo eliminar libgcj no lo utilicé, pero quien desee removerlo, ahí está la referencia.

0 comentarios:

 

Copyright © El igloo de Tux Design by O Pregador | Blogger Theme by Blogger Template de luxo | Powered by Blogger