Qual é o destino correto para a variável de ambiente JAVA_HOME para uma distribuição Linux OpenJDK baseada em Debian?

91

No Windows, JAVA_HOMEdeve apontar para a pasta de instalação do JDK (para que JAVA_HOME/bincontenha todos os executáveis ​​e JAVA_HOME/libstodas as jarbibliotecas padrão ).

Se eu baixar o pacote JDK da Sun e instalá-lo no Linux, é o mesmo procedimento.

No entanto, preciso usar o pacote OpenJDK padrão do Kubuntu. O problema é que todos os executáveis ​​são colocados em /usr/bin. Mas os potes são colocados /usr/share/java. Como eles não estão na mesma JAVA_HOMEpasta, estou tendo problemas com Grails e talvez haja problemas com outros aplicativos que esperam a estrutura Java padrão.

  1. Se eu usar:

    JAVA_HOME=/usr
    

    Todos os aplicativos e scripts que desejam usar qualquer executável Java podem usar o procedimento padrão call $JAVA_HOME/bin/executable. No entanto, uma vez que os frascos estão em um lugar diferente, eles nem sempre são encontrados (exemplo: no grails Eu estou ficando ClassDefNotFoundpara native2ascii).

  2. Por outro lado, se eu usar:

    JAVA_HOME=/usr/share/java
    

    Nenhum dos executáveis Java ( java, javac, etc.) pode ser encontrado.

Então, qual é a maneira correta de lidar com a JAVA_HOMEvariável em um Linux baseado em Debian?

Obrigado pela sua ajuda, Luis

Luis soeiro
fonte

Respostas:

99

O que finalmente funcionou para mim (Grails agora funciona perfeitamente) está indo quase como Steve B. apontou:

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

Dessa forma, se o usuário alterar o JDK padrão do sistema, JAVA_HOMEainda funcionará.

default-java é um link simbólico para o JVM atual.

Luis soeiro
fonte
6
Parece que esse link não existe no Debian 7
a1an
3
No RHEL5.10, é / usr / lib / jvm / java
Brian,
1
Usei / usr / lib / jvm / java-7-openjdk-amd64
Randall Bohn
Para Oracle Linux 7 (isso deve se aplicar ao CentOS e RHEL), criei um arquivo chamado /etc/profile.d/java.sh e populei-o com o seguinte: JAVA_HOME = / usr / lib / jvm / jre-openjdk export JAVA_HOME após o re-sourcing de / etc / profile (executando o source / etc / profile) JAVA_HOME foi preenchido conforme o esperado.
darnold0714
80

Se você usar alternativas para gerenciar várias versões de java, você pode definir o JAVA_HOMEbaseado no java (ou javac) com link simbólico como este:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
bbaassssiiee
fonte
3
Isso funciona para mim: JAVA_HOME = $ (readlink -f / usr / bin / java | sed "s: / jre / bin / java ::")
dpnsan
4
Solução brilhante, resolve minhas dores de cabeça de anos com JAVA_HOME, que tende a apontar para lugares diferentes em sistemas operacionais diferentes.
Datageek
3
note que esta solução inteligente não funcionará em distros como o Gentoo que /usr/bin/javaapontam para um script ( /usr/libexec/eselect-java/run-java-tool.bash). ainda assim, é uma boa abordagem. a única coisa que eu mudaria é usar a substituição sedJAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
embutida
Isso funciona bem :) Talvez você queira mudar javacpara javaporque nem todo mundo tem o JDK instalado; apenas o JRE
Hanxue
1
@AlexisWilke agora java em vez de javac
bbaassssiiee
7

A instalação padrão do Ubuntu parece incluir as várias versões do Java /usr/lib/jvm. O javacjava que você encontrar em seu caminho fará um softlink para isso.

Não há problema em instalar sua própria versão do Java em qualquer lugar que desejar, desde que você defina a JAVA_HOMEvariável de ambiente e certifique-se de ter o novo Java binem seu caminho.

Uma maneira simples de fazer isso é ter a casa do Java como um softlink, de modo que se você quiser atualizar ou trocar de versão, você só precisa mudar o diretório para o qual este aponta - por exemplo:

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

/opt/jdk --> /opt/jdk1.6.011
Steve B.
fonte
é perigoso recomendar soluções Ubuntu com Debian. Eles podem e variam.
RichieHH
4
Observe que o solicitante disse que usava o Kubuntu, então as soluções do Ubuntu devem funcionar.
Joseph Holsten
0

Normalmente não tenho nenhuma variável de ambiente JAVA_HOME. Java pode configurá-lo sozinho. Dentro da propriedade de sistema java java.home deve estar disponível.

iny
fonte
Eu geralmente também não tenho. No entanto, se eu não configurá-lo, grails reclama que JAVA_HOME não está lá e aborta.
Luis Soeiro
1
A formiga também precisa disso no debian, que é o contexto
RichieHH
0

Tente definir também a variável JAVA_LIB.

Cantillon
fonte
0

Se você tiver problemas com os arquivos JAR não sendo encontrados, também asseguraria que seu CLASSPATH esteja configurado para incluir a localização desses arquivos. No entanto, acho que o CLASSPATH geralmente precisa ser definido de maneira diferente para programas diferentes e muitas vezes acaba sendo algo a ser definido exclusivamente para programas individuais.

MVang
fonte
0

Eu descobri problemas semelhantes com os pacotes openjdk-6-jre e openjdk-6-jre-headless no Ubuntu.

Meu problema foi resolvido purgando os pacotes openjdk-6-jre e openjdk-6-jre-headless e reinstalando. As alternativas são atualizadas apenas em uma nova instalação dos pacotes openjdk-6-jre e openjdk-6-jre-headless.

Abaixo está um exemplo de instalação após a 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.
...

Você pode ver acima que update-alternativesé executado para configurar links para os vários binários Java.

Após esta instalação, também existem links em /usr/bin, links em /etc/alternativese arquivos para cada binário em /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 comparar isso com a instalação sem 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 você vê, update-alternativesnão é acionado.

Após esta instalação, não há arquivos para os binários Java em /var/lib/dpkg/alternatives, nenhum link em /etc/alternativese nenhum link em /usr/bin.

A remoção dos arquivos /var/lib/dpkg/alternativestambém quebra update-java-alternatives.

Junção de Saturno
fonte
0

Ubuntu 12.04 isso funciona ...

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

Alex
fonte
0

Como uma atualização para o usuário do fedora, as alternativas definem o diretório java atual para / usr / java / default

então você deve definir seu JAVA_HOME para / usr / java / default para sempre ter alternativas de seleção atual em seu classpath

HTH!

Greg Henry
fonte
0

Eu sempre costumo definir o JAVA_HOME de acordo com o /usr/bin/java.

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

Dessa forma, ambas as alternativas apontam para o mesmo local

Ivo
fonte
-1

Pelo que me lembro, usei o script update-java-transactions em vez do update-alternativas. E configurou o JAVA_HOME para mim corretamente.

Tobias Schulte
fonte
Não funciona no Ubuntu 20.4
Martin Schröder
-1

Por favor, veja o que o comando atualizar-alternativas faz (ele tem um bom homem ...).

Em breve - o que acontece quando você tem java-sun-1.4 e java-opensouce-1.0 ... qual leva "java"? Debian "/ usr / bin / java" é um link simbólico e "/usr/bin/java-sun-1.4" é uma alternativa para "/ usr / bin / java"

Edit: Como disse Richard, update-alternativesnão é suficiente. Você realmente precisa usar update-java-alternatives. Mais informações em:

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

elcuco
fonte
alternativas de atualização não são suficientes. Precisa ser update-java-alternative
RichieHH
@Richard: sim, notou. É a primeira vez que faço isso, então pesquisei no Google e encontrei a documentação do Ubuntu. Obrigado!
elcuco
-2

Meu objetivo correto sempre foi fazer o download da Sun e apenas instalá-lo dessa forma. Então você sabe exatamente em qual diretório tudo vai.

Mas se você preferir continuar com a maneira estranha de instalação do Debian, meu melhor palpite seria o diretório pai logo acima de onde os binários java e javac estão localizados.

(já que quando você especifica em seu caminho é $ JAVA_HOME / bin) (então no seu caso seria ... $ JAVA_HOME / share e $ JAVA_HOME seria / usr?)

Eh, isso não parece certo ...

Também estou interessado em ouvir a resposta!

leeand00
fonte
Ao usar o debian, você realmente precisa se manter com as estruturas debian ou atualizações posteriores do sistema o deixarão com um sistema quebrado.
RichieHH