Qual é o alvo correto para a variável de ambiente JAVA_HOME para uma distribuição baseada no Debian Linux OpenJDK?
-
20-08-2019 - |
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.
-
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 ficandoClassDefNotFound
paranative2ascii
) -
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
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: