2009-03-19 14 views
71

En Windows, JAVA_HOME debe apuntar a la carpeta de instalación JDK (para que contenga todos los archivos ejecutables y JAVA_HOME/libs contiene todas las bibliotecas jar predeterminadas).¿Cuál es el objetivo correcto para la variable de entorno JAVA_HOME para una distribución Linux OpenJDK basada en Debian?

Si descargo el paquete Sun's JDK y lo instalo en Linux, es el mismo procedimiento.

Sin embargo, necesito usar el paquete OpenJDK predeterminado de Kubuntu. El problema es que todos los ejecutables se colocan en /usr/bin. Pero los frascos se colocan en /usr/share/java. Como no están en la misma carpeta JAVA_HOME, tengo problemas con Grails y es posible que haya problemas con otras aplicaciones que esperan la estructura Java estándar.

  1. si uso:

    JAVA_HOME=/usr 
    

    Todas las aplicaciones y scripts que desean utilizar cualquier archivo ejecutable de Java pueden utilizar el procedimiento estándar call $JAVA_HOME/bin/executable. Sin embargo, dado que los frascos están en un lugar diferente, no siempre se encuentran (ejemplo: en Grails obtengo ClassDefNotFound para native2ascii).

  2. Por otro lado, si uso:

    JAVA_HOME=/usr/share/java 
    

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

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

Gracias por su ayuda, Luis

+2

¡No puedo creer que los mods no hayan cerrado esta útil pregunta como "fuera del tema"! – HDave

Respuesta

87

lo que finalmente trabajó para mí (Griales 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 todavía funciona.

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

+5

Parece que no existe tal enlace en Debian 7 – a1an

+3

En RHEL5.10, es/usr/lib/jvm/java – Brian

+1

Utilicé/usr/lib/jvm/java-7-openjdk-amd64 –

-1

Mi objetivo siempre ha sido correcta para descargarlo de Sun y sólo tiene que instalar esa manera. Entonces sabrá exactamente a qué directorio pertenece todo.

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

(ya que cuando se especifica que en su camino es $ JAVA_HOME/bin) (Así que en su caso sería ... $ JAVA_HOME/acción y $ JAVA_HOME sería/usr?)

Eh, eso no suena bien ...

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

+0

Al usar Debian, realmente necesita mantenerse con las estructuras de Debian o las actualizaciones posteriores del sistema lo dejarán con un sistema descompuesto. – RichieHH

0

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.

+0

Por lo general, tampoco lo tengo. Sin embargo, si no lo configuro, Grails se queja de que JAVA_HOME no está allí y aborta. –

+0

ant lo necesita también en debian que es el contexto – RichieHH

6

La instalación estándar de Ubuntu parece poner las diferentes versiones de Java en /usr/lib/jvm. El javac, java que encuentre en su camino, se enlazará a esto.

No hay problema con la instalación de su propia versión de Java en cualquier lugar que desee, siempre y cuando configure la variable de entorno JAVA_HOME y asegúrese de tener la nueva Java bin en su ruta.

Una forma sencilla de hacer esto es hacer que el inicio de Java existir como un enlace de software, por lo que si desea actualizar o cambiar las versiones es suficiente con cambiar el directorio que esto apunta a - por ejemplo:

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

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

es peligroso recomendar soluciones Ubuntu con Debian. Ellos pueden variar y lo hacen. – RichieHH

+3

Tenga en cuenta que el solicitante dijo que usó Kubuntu, por lo que las soluciones de Ubuntu deberían estar bien. –

-1

Por favor, mira lo que hace el comando update-alternatives (tiene un buen hombre ...).

En pocas palabras, ¿qué sucede cuando tienes java-sun-1.4 y java-opensouce-1.0 ... cuál lleva "java"? Se Debian "/ usr/bin/java" es 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 necesita usar update-java-alternatives. Más información en:

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

+0

actualización-alternativas no es suficiente. Necesita ser update-java-alternatives – RichieHH

+0

@Richard: sí, notado. La primera vez que lo busqué, busqué en Google y encontré la documentación de Ubuntu. ¡Gracias! – elcuco

0

intente configurar la variable JAVA_LIB también.

0

Por lo que recuerdo, utilicé el script update-java-alternatives en lugar de las alternativas de actualización. Y configuró el JAVA_HOME para mí correctamente.

1

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

48

Si utiliza alternativas, puede establecer la JAVA_HOME basado en el java enlace simbólico como esto:

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

Eso funciona, excepto que tengo "java" y no "javac". –

+3

Esto funciona para mí: JAVA_HOME = $ (readlink -f/usr/bin/java | sed "s: /jre/bin/java ::") – dpnsan

+3

Solución brillante, soluciona mis dolores de cabeza de años con JAVA_HOME, que tiende a señalar a diferentes lugares en diferentes sistemas operativos. – Datageek

1

he descubierto problemas similares con el OpenJDK-6-jre y paquetes OpenJDK-6-jre-headless en Ubuntu.

Mi problema se resolvió purgando los paquetes openjdk-6-jre y openjdk-6-jre-headless y volviendo a instalar. Las alternativas solo se actualizan en una nueva instalación de los paquetes openjdk-6-jre y openjdk-6-jre-headless.

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

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. 
... 

Se puede ver por encima de ese update-alternatives se ejecuta para configurar los vínculos de los diversos archivos binarios de Java.

Después de esta instalación, también hay enlaces en /usr/bin, enlaces en /etc/alternatives y 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 contar esto con la instalación sin purgar.

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 ve, update-alternatives no está activado.

Después de esta instalación, no hay archivos para los binarios de Java en /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.

0

Ubuntu 12.04 esto funciona ...

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

0

Como una actualización para usuarios de Fedora, las alternativas de configurar el directorio actual de java a /usr/java/default

lo que tiene que configurar su JAVA_HOME en/usr/java/default para tener siempre las alternativas de selección curent en la ruta de clases

HTH!

Cuestiones relacionadas