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

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

Pergunta

Em Windows, aponte JAVA_HOME obrigação para a pasta de instalação do JDK (de modo que JAVA_HOME/bin contém todos os executáveis ??e JAVA_HOME/libs contém todas as bibliotecas jar padrão).

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

No entanto, eu preciso usar o pacote OpenJDK padrão do Kubuntu. O problema é que todos os executáveis ??são colocados em /usr/bin. Mas os frascos são colocados em /usr/share/java. Uma vez que eles não estão sob o mesmo JAVA_HOME pasta que eu estou tendo problemas com Grails e talvez haverá problemas com outros aplicativos que esperam a estrutura Java padrão.

  1. Se eu usar:

    JAVA_HOME=/usr
    

    Todas as aplicações e scripts que deseja usar qualquer executável Java pode usar o procedimento call $JAVA_HOME/bin/executable padrão. 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 ClassDefNotFound para 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, o que é a maneira correta de lidar com a variável JAVA_HOME em um Linux baseado em Debian?

Obrigado por sua ajuda, Luis

Foi útil?

Solução

O que finalmente funcionou para mim (Grails agora funciona sem problemas) está fazendo quase como Steve B. tem fora pontas:

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

Desta forma, se o usuário altera o padrão JDK para o sistema, JAVA_HOME ainda funciona.

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

Outras dicas

Se você utilizar alternativas para gerenciar múltiplas versões Java, você pode definir o JAVA_HOME baseado no java simbolicamente (ou javac) como este:

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

O padrão de instalação do Ubuntu parece colocar as várias versões Java no /usr/lib/jvm. O javac, java você encontrar no seu caminho vai softlink a isso.

Não há nenhum problema com a instalação de sua própria versão Java em qualquer lugar que quiser, contanto que você definir a variável de ambiente JAVA_HOME e certifique-se de ter o novo bin Java em seu caminho.

Uma maneira simples de fazer isso é ter a exist casa Java como um link simbólico, de modo que se você quiser atualizar ou versões interruptor que você só tem que mudar o diretório que isso aponta para - por exemplo:.

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

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

Eu geralmente não têm qualquer variável de ambiente JAVA_HOME. Java pode configurá-lo em si. propriedade dentro do sistema java java.home deve estar disponível.

Tente configurar a variável JAVA_LIB também.

Tanto quanto me lembro, eu usei o script update-java-alternativas em vez dos update-alternatives. E se definir o JAVA_HOME para mim corretamente.

Se você tem problemas com arquivos JAR não sendo encontrado também gostaria de garantir a sua CLASSPATH está definida para incluir a localização desses arquivos. Eu encontrar no entanto que a CLASSPATH muitas vezes precisa ser definido de forma diferente para diferentes programas e muitas vezes acaba sendo algo para definir exclusivamente para programas individuais.

resposta que vai resolver seu problema e também apenas um bom general how-to para instalar o Oracle Java 7 no Ubuntu pode ser encontrada aqui Atualizado: http://www.wikihow.com/Install-Oracle-Java-on-Ubuntu-Linux

Eu descobri problemas semelhantes com o OpenJDK-6-jre e pacotes OpenJDK-6-jre-headless no Ubuntu.

O meu problema foi resolvido por purgar o OpenJDK-6-jre e pacotes OpenJDK-6-jre-sem cabeça e re-instalação. As alternativas são atualizados apenas em uma nova instalação dos pacotes OpenJDK-6-jre e openjdk-6-jre-headless.

Abaixo está uma amostra de instalar após 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, há também links em /usr/bin, links em /etc/alternatives e 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 contast 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-alternatives não é acionado.

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

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

Ubuntu 12.04 isso funciona ...

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

Como uma atualização para o usuário fedora, alternativas definir diretório java atual para / Usr / java / default

então você tem que definir o seu JAVA_HOME para / usr / java / default sempre ter alternativas selecção curent no seu classpath

HTH!

Meu alvo correto sempre foi o de fazer o download do Sol e apenas instalá-lo dessa forma. Então você sabe exatamente o diretório tudo vai em.

Mas se você preferir ficar com o modo estranho que o Debian instala-lo, meu melhor palpite seria o diretório pai logo acima onde os binários java e javac estão localizados.

(desde quando você especificá-lo em seu caminho é US $ JAVA_HOME / bin) (Assim, no seu caso, seria ... $ JAVA_HOME / ação e US $ JAVA_HOME seria / usr?)

Eh, que não soa bem ...

Estou interessado em ouvir a resposta a esta também!

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

Logo - o que acontece quando você tem java-sun-1.4 e java-opensouce-1.0 ... qual deles leva "java"? Ele debian "/ usr / bin / java" é link simbólico e "/usr/bin/java-sun-1.4" é uma alternativa para "/ usr / bin / java"

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

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top