¿Cuál es el destino correcto para la variable de entorno JAVA_HOME para una distribución basada en Linux OpenJDK Debian?

91

En Windows, JAVA_HOMEdebe apuntar a la carpeta de instalación de JDK (para que JAVA_HOME/bincontenga todos los ejecutables y JAVA_HOME/libscontenga todas las jarbibliotecas predeterminadas ).

Si descargo el paquete JDK de Sun 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 formato /usr/bin. Pero los frascos están colocados /usr/share/java. Como no están en la misma JAVA_HOMEcarpeta, tengo problemas con Grails y tal vez haya problemas con otras aplicaciones que esperan la estructura estándar de Java.

  1. Si uso:

    JAVA_HOME=/usr
    

    Todas las aplicaciones y scripts que quieran utilizar cualquier 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 griales estoy ClassDefNotFoundbuscando native2ascii).

  2. Por otro lado, si uso:

    JAVA_HOME=/usr/share/java
    

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

Entonces, ¿cuál es la forma correcta de manejar la JAVA_HOMEvariable en un Linux basado en Debian?

Gracias por tu ayuda, Luis

Luis Soeiro
fuente

Respuestas:

98

Lo que finalmente funcionó para mí (Grails ahora funciona sin problemas) es 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_HOMEaún funciona.

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

Luis Soeiro
fuente
6
Parece que no existe tal enlace en Debian 7
a1an
3
En RHEL5.10, es / usr / lib / jvm / java
Brian
1
Usé / usr / lib / jvm / java-7-openjdk-amd64
Randall Bohn
Para Oracle Linux 7 (esto debería aplicarse a CentOS y RHEL), creé un archivo llamado /etc/profile.d/java.sh y lo llené con lo siguiente: JAVA_HOME = / usr / lib / jvm / jre-openjdk export JAVA_HOME después de volver a obtener / etc / profile (ejecutando source / etc / profile), JAVA_HOME se completó como se esperaba.
darnold0714
80

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

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
bbaassssiiee
fuente
3
Esto funciona para mí: JAVA_HOME = $ (readlink -f / usr / bin / java | sed "s: / jre / bin / java ::")
dpnsan
4
Solución brillante, resuelve mis dolores de cabeza de años con JAVA_HOME, que tiende a apuntar a diferentes lugares en diferentes sistemas operativos.
Datageek
3
tenga en cuenta que esta inteligente solución no funcionará en distribuciones como Gentoo que tengan /usr/bin/javaapuntar a un script ( /usr/libexec/eselect-java/run-java-tool.bash). aún así, es un buen enfoque. lo único que cambiaría es usar la sustitución incorporada de Bash para evitar el desove sed, por ejemplo:JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
RubyTuesdayDONO
Esto funciona bien :) Es posible que desee cambiar javaca javaporque no todo el mundo tiene el JDK instalado; solo el JRE
Hanxue
1
@AlexisWilke ahora java en lugar de javac
bbaassssiiee
7

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

No hay ningún problema con instalar su propia versión de Java en cualquier lugar que desee, siempre que configure la JAVA_HOMEvariable de entorno y asegúrese de tener el nuevo Java binen su ruta.

Una forma sencilla de hacer esto es hacer que la casa de Java exista como un enlace suave, de modo que si desea actualizar o cambiar de versión, solo tenga que cambiar el directorio al que apunta, por ejemplo:

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

/opt/jdk --> /opt/jdk1.6.011
Steve B.
fuente
es peligroso recomendar soluciones de Ubuntu con Debian. Pueden variar y varían.
RichieHH
4
Tenga en cuenta que el solicitante dijo que usó Kubuntu, por lo que las soluciones de Ubuntu deberían estar bien.
Joseph Holsten
0

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

iny
fuente
Yo tampoco lo tengo normalmente. Sin embargo, si no lo configuro, Grails se queja de que JAVA_HOME no está allí y se interrumpe.
Luis Soeiro
1
hormiga también lo necesita en debian, que es el contexto
RichieHH
0

Intente configurar la variable JAVA_LIB también.

Cantillon
fuente
0

Si tiene problemas con los archivos JAR que no se encuentran, también me aseguraría de que su CLASSPATH esté configurada para incluir la ubicación de esos archivos. Sin embargo, 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.

MVang
fuente
0

Descubrí problemas similares con los paquetes openjdk-6-jre y openjdk-6-jre-headless en Ubuntu.

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

A continuación se muestra una muestra de la 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.
...

Puede ver arriba que update-alternativesse ejecuta para configurar enlaces para los diversos binarios de Java.

Después de esta instalación, también hay enlaces /usr/bin, enlaces /etc/alternativesy 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

Comparemos 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 ves, update-alternativesno se dispara.

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

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

Cruce de Saturno
fuente
0

Ubuntu 12.04 esto funciona ...

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

Alex
fuente
0

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

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

HTH!

Greg Henry
fuente
0

Siempre tiendo a configurar JAVA_HOME de acuerdo con /usr/bin/java.

JAVA_HOME="$(dirname -- "$(dirname -- "$(readlink -f /usr/bin/java)")")"

De esta forma, ambas alternativas apuntan a la misma ubicación

Ivo
fuente
-1

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

Tobias Schulte
fuente
No es así en Ubuntu 20.4
Martin Schröder hace
-1

Por favor, vea lo que hace el comando de actualización-alternativas (tiene un buen hombre ...).

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

Editar: Como dijo Richard, update-alternativesno es suficiente. Realmente necesitas usar update-java-alternatives. Más info en:

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

elcuco
fuente
actualizar-alternativas no es suficiente. Debe ser update-java-alternativas
RichieHH
@Richard: sí, anotado. La primera vez que me dirijo a él, busqué en Google y encontré la documentación de Ubuntu. ¡Gracias!
elcuco
-2

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

Pero si prefiere seguir con la forma extraña en que Debian lo instala, mi mejor suposición sería el directorio padre justo encima 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 ...

¡También me interesa escuchar la respuesta a esto!

leeand00
fuente
Cuando use Debian, realmente necesita mantenerse con las estructuras de Debian o las actualizaciones posteriores del sistema lo dejarán con un sistema roto.
RichieHH