¿Cuál es el objetivo correcto para la variable de entorno JAVA_HOME para Linux OpenJDK basadas en Debian, la distribución?

StackOverflow https://stackoverflow.com/questions/663658

Pregunta

En Windows, JAVA_HOME debe apuntar a la carpeta de instalación del JDK (de modo que JAVA_HOME/bin contiene todos los archivos ejecutables y JAVA_HOME/libs contiene todo por defecto jar las bibliotecas).

Si puedo descargar la JDK de Sun paquete y lo instala en Linux, es el mismo procedimiento.

Sin embargo, tengo que usar Kubuntu por defecto del paquete OpenJDK.El problema es que todos los archivos ejecutables que se colocan en /usr/bin.Pero los frascos se colocan en /usr/share/java.Ya que no están bajo el mismo JAVA_HOME carpeta estoy teniendo problemas con Grails y tal vez habrá problemas con otras aplicaciones que esperan que el estándar de Java de la estructura.

  1. Si yo uso:

    JAVA_HOME=/usr
    

    Todas las aplicaciones y secuencias de comandos que desea utilizar cualquier ejecutable Java, puede utilizar el procedimiento estándar call $JAVA_HOME/bin/executable.Sin embargo, desde que los frascos en un lugar diferente, que no siempre se encuentran (por ejemplo:en grails estoy consiguiendo ClassDefNotFound para native2ascii).

  2. Por otro lado, si yo uso:

    JAVA_HOME=/usr/share/java
    

    Ninguno de los Java ejecutables (java, javac, etc.) se puede encontrar.

Así que, ¿cuál es la forma correcta de manejar la JAVA_HOME variable en un Linux basadas en Debian?

Gracias por tu ayuda, Luis

¿Fue útil?

Solución

Lo que finalmente funcionó para mí (Grails ahora funciona sin problemas) está haciendo casi como Steve B. ha señalado:

JAVA_HOME=/usr/lib/jvm/default-java

De esta manera, si el usuario cambia el JDK predeterminado para el sistema, JAVA_HOME aún funciona.

default-java es un enlace simbólico a la JVM actual.

Otros consejos

Si usa alternativas para administrar múltiples versiones de java, puede configurar el JAVA_HOME basado en el enlace simbólico de java (o javac) de esta manera:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")

El estándar de Ubuntu instalar parece poner las distintas versiones de Java en /usr/lib/jvm.El javac, java que encuentre en su camino le softlink a este.

No hay ningún problema con la instalación de su propia versión de Java en cualquier lugar que te gusta, como establece la JAVA_HOME variable de entorno y asegurarse de tener el nuevo Java bin en su trayectoria.

Una manera simple de hacer esto es tener el Java casa existir como un softlink, por lo que si desea actualizar o cambiar de versiones sólo tiene que cambiar el directorio que esto apunta a que - por ejemplo:

/usr/bin/java --> /opt/jdk/bin/java,

/opt/jdk --> /opt/jdk1.6.011

Normalmente no tengo ninguna variable de entorno JAVA_HOME. Java puede configurarlo por sí mismo. Dentro de la propiedad del sistema java java.home debería estar disponible.

Intente configurar también la variable JAVA_LIB.

Hasta donde recuerdo, utilicé el script update-java-alternative en lugar de las alternativas de actualización. Y configuró el JAVA_HOME para mí correctamente.

Si tiene problemas con los archivos JAR que no se encuentran, también me aseguraría de que CLASSPATH esté configurado para incluir la ubicación de esos archivos. Sin embargo, sí encuentro que CLASSPATH a menudo debe configurarse de manera diferente para diferentes programas y, a menudo, termina siendo algo que se configura de manera única para programas individuales.

Aquí puede encontrar una respuesta actualizada que resolverá su problema y también un buen procedimiento general para instalar Oracle Java 7 en Ubuntu: http://www.wikihow.com/Install-Oracle-Java-on-Ubuntu-Linux

He descubierto problemas similares con el openjdk-6-jre y openjdk-6-jre-headless paquetes en Ubuntu.

Mi problema fue resuelto por la purga de la openjdk-6-jre y openjdk-6-jre-headless paquetes y volver a instalar.Las alternativas son sólo actualiza una instalación limpia de la openjdk-6-jre y openjdk-6-jre-headless paquetes.

A continuación se muestra un ejemplo de instalación después de la purga:

aptitude purge openjdk-6-jre openjdk-6-jre-headless # to ensure no configuration exists
aptitude install --without-recommends openjdk-6-jre # Installing without some extras
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
  ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
  openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
The following packages are RECOMMENDED but will NOT be installed:
  icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Selecting previously deselected package openjdk-6-jre-lib.
(Reading database ... 62267 files and directories currently installed.)
Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
...
Processing triggers for man-db ...
Setting up tzdata-java (2012e-0ubuntu0.10.04) ...
...
Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/java to provide /usr/bin/java (java) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/keytool to provide /usr/bin/keytool (keytool) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/pack200 to provide /usr/bin/pack200 (pack200) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmid to provide /usr/bin/rmid (rmid) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmiregistry to provide /usr/bin/rmiregistry (rmiregistry) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/unpack200 to provide /usr/bin/unpack200 (unpack200) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/orbd to provide /usr/bin/orbd (orbd) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/servertool to provide /usr/bin/servertool (servertool) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/tnameserv to provide /usr/bin/tnameserv (tnameserv) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/lib/jexec to provide /usr/bin/jexec (jexec) in auto mode.
Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/policytool to provide /usr/bin/policytool (policytool) in auto mode.
...

Usted puede ver por encima de que update-alternatives se ejecuta a fin de establecer vínculos de los distintos Java binarios.

Después de esta instalación, también hay enlaces en /usr/bin, los enlaces en /etc/alternatives, y los archivos para cada binario en /var/lib/dpkg/alternatives.

ls -l /usr/bin/java /etc/alternatives/java /var/lib/dpkg/alternatives/java
lrwxrwxrwx 1 root root  40 2013-01-16 14:44 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
lrwxrwxrwx 1 root root  22 2013-01-16 14:44 /usr/bin/java -> /etc/alternatives/java
-rw-r--r-- 1 root root 158 2013-01-16 14:44 /var/lib/dpkg/alternatives/java

Vamos a contast este con la instalación sin purga.

aptitude remove openjdk-6-jre
aptitude install --without-recommends openjdk-6-jre
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
  ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
  openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
The following packages are RECOMMENDED but will NOT be installed:
  icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Selecting previously deselected package openjdk-6-jre-lib.
(Reading database ... 62293 files and directories currently installed.)
Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
...
Processing triggers for man-db ...
...
Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...

Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
...

Como se puede ver, update-alternatives no se activa.

Después de esta instalación, no hay archivos para los archivos binarios en Java /var/lib/dpkg/alternatives, no hay enlaces en /etc/alternatives, y no hay enlaces en /usr/bin.

La eliminación de los archivos en /var/lib/dpkg/alternatives también se rompe update-java-alternatives.

Ubuntu 12.04 esto funciona ...

JAVA_HOME = / usr / lib / jvm / java-6-openjdk-i386 / jre

Como una actualización para el usuario de fedora, las alternativas establecen el directorio java actual en / usr / java / default

por lo que debe establecer su JAVA_HOME en / usr / java / default para tener siempre alternativas de selección actual en su classpath

HTH!

Mi objetivo correcto siempre ha sido descargarlo de Sun e instalarlo de esa manera. Entonces sabes exactamente en qué directorio va todo.

Pero si prefiere seguir con la extraña forma en que Debian lo instala, mi mejor conjetura sería el directorio padre justo arriba de donde se encuentran los binarios java y javac.

(ya que cuando lo especifica en su ruta es $ JAVA_HOME / bin) (Entonces, en su caso, sería ... $ JAVA_HOME / share y $ JAVA_HOME sería / usr?)

Eh, eso no suena bien ...

¡Estoy interesado en escuchar la respuesta a esto también!

Por favor, vea lo que hace el comando actualizar-alternativas (tiene un buen hombre ...).

En breve: ¿qué sucede cuando tiene java-sun-1.4 y java-opensouce-1.0 ... cuál toma " java " ;? Debian & Quot; / usr / bin / java & Quot; es un enlace simbólico y " /usr/bin/java-sun-1.4 " es una alternativa a " / usr / bin / java "

Editar: Como dijo Richard, update-alternatives no es suficiente. Realmente necesitas usar update-java-alternatives. Más información en:

https://help.ubuntu.com/community/Java

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top