Quais são os locais padrão que o Java Virtual Machine está configurado no Ubuntu 12.04?

5

Estou executando o Pangolin (12.04 LTS) e quero classificar algumas coisas Java onde minha JVM está apontando para um local diferente do meu Compilador.

Para demonstrar, minha JVM é a seguinte:

pcrow@pcrow-HP-notebook:~/Documents$ java -version
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.4)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)

Considerando que meu Compilador aponta aqui:

pcrow@pcrow-HP-notebook:~/Documents$ javac -version
javac 1.7.0_51

Configurei o último adicionando uma entrada ao meu arquivo ~/.profile . O problema é que não tenho certeza do que define o primeiro e quero que eles sejam consistentes. Em '/ etc / environment' eu tenho a seguinte entrada:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

E quando eu corro printenv | grep "java"

PATH=/usr/share/maven/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/java-7-openjdk-amd64/bin
JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64


Você pode me dizer onde o IcedTea6 é mais provável no Ubuntu? Eu gostaria de sobrescrevê-lo se puder e garantir que minha JVM e Compiler estejam usando a mesma versão.

    
por Crowie 13.02.2014 / 20:05

2 respostas

4

Começando com seu último parágrafo

  

Você pode me dizer onde o IcedTea6 provavelmente está instalado no Ubuntu? Eu gostaria de sobrescrevê-lo se puder e garantir que minha JVM e Compiler estejam usando a mesma versão.

O Ubuntu fornece uma ótima ferramenta para selecionar um JDK / JRE a partir de múltiplas instalações. Isso é update-java-alternatives . Está intimamente ligado à ferramenta update-alternatives .

Cada JDK / JRE inclui um conjunto de ferramentas Java como javac , java , javaws , jinfo , javah etc. Uma instalação pode vir com um arquivo .jinfo oculto em que esses componentes java estão listadas. No meu sistema, quando eu instalo o pacote openjdk-8-jdk , um arquivo /usr/lib/jvm/.java-1.8.0-openjdk-amd64.jinfo é criado. O conteúdo desse arquivo é (pulou algumas linhas)

name=java-8-openjdk-amd64
alias=java-1.8.0-openjdk-amd64
priority=1081
section=main

hl rmid /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/rmid
hl java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
hl keytool /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/keytool
hl jjs /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/jjs
hl pack200 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/pack200
hl rmiregistry /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/rmiregistry
.
.
. (skipped lines)
.
.
jdkhl jdb /usr/lib/jvm/java-8-openjdk-amd64/bin/jdb
jdkhl serialver /usr/lib/jvm/java-8-openjdk-amd64/bin/serialver
jdkhl wsgen /usr/lib/jvm/java-8-openjdk-amd64/bin/wsgen
jdkhl jcmd /usr/lib/jvm/java-8-openjdk-amd64/bin/jcmd
jdk appletviewer /usr/lib/jvm/java-8-openjdk-amd64/bin/appletviewer
jdk jconsole /usr/lib/jvm/java-8-openjdk-amd64/bin/jconsole
plugin mozilla-javaplugin.so /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/IcedTeaPlugin.so

update-java-alternatives usa esse arquivo para criar links alternativos no diretório /etc/alternatives . O propósito deste diretório é fornecer um mecanismo pelo qual você pode selecionar um programa padrão a partir de um conjunto de ferramentas similares. Isso é ótimo para várias versões do JDK (veja mais em update-alternatives )

Breve discussão de update-alternatives

Para demonstrar o processo brevemente. Quando um programa é instalado pela primeira vez, ele registra suas alternativas para um nome mestre (como javac ) no banco de dados de alternativas (isso está contido no diretório /var/lib/dpkg/alternatives ). Durante o processo de instalação, update-alternatives cria um link mestre em /usr/bin/javac apontando para /etc/alternatives/javac , que também é um link simbólico apontando para o arquivo real do JDK.

Agora, quando você instalar outro JDK, ele também terá um programa javac . Portanto, ao instalar o segundo JDK update-alternatives atualiza automaticamente o link simbólico /etc/alternatives/javac para apontar para aquele com a prioridade mais alta. Ele também atualiza o banco de dados de alternativas, para que você possa selecionar manualmente um padrão chamando-o.

Voltar para o update-java-alternatives

update-java-alternatives usa update-alternatives para fornecer um conjunto completo de padrões de uma única instalação do JDK / JRE. A idéia é que você selecione uma instalação do JDK / JRE e todas as ferramentas desse JRE / JDK serão usadas como padrão para fornecer várias ferramentas Java, evitando que você use update-alternatives para cada ferramenta. Então, quando você usa update-java-alternatives para selecionar um JDK, digamos openjdk-8-jdk por exemplo, ele faz as ferramentas Java deste JDK (como javac , java , javaws etc) como padrão. Contanto que o JDK esteja instalado corretamente e liste suas ferramentas em .jinfo file .

TL; DR

Portanto, para responder à sua consulta em resumo, o IcedTea6 Plugin é configurado no arquivo .jinfo e update-java-alternatives usa esse arquivo para atualizar os links para apontá-lo. Portanto, você precisa criar um arquivo para o JDK listando o plug-in e todas as ferramentas java e use update-java-alternatives .

Se você instalou o JDK / JRE manualmente, verifique esta pergunta para obter ajuda, tornando-a reconhecida pela ferramenta update-java-alternatives .

Mas ainda temos problemas ...

Parece que este update-java-alternatives não está mais atualizando os componentes do JDK ultimamente. Está apenas atualizando as ferramentas do JRE. Há muitas queixas dizendo que o uso dessa ferramenta não atualiza todos os componentes do Java. Depois de experimentar o mesmo problema e gastar quase 5 horas, acho que encontrei uma solução. A solução está apenas alterando o arquivo hl para jre e jdkhl para jdk in .jinfo . Encontrei um antigo arquivo .jinfo no github , onde eles eram jre e jdk .

A correção para o arquivo .jinfo .

Então, para corrigir isso, você precisa alterar hl e jdkhl s. Se o seu arquivo é .openjdk-8-jdk.jinfo in /usr/lib/jvm/ use este comando

sudo sed -i 's/^hl/jre/p' /usr/lib/jvm/.openjdk-8-jdk.jinfo
sudo sed -i 's/^jdkhl/jdk/p' /usr/lib/jvm/.openjdk-8-jdk.jinfo

Agora, para atualizar, primeiro liste as alternativas

sudo update-java-alternatives -l

Ele retornará algo assim (a resposta real pode ser diferente para você)

java-1.8.0-openjdk-amd64       1081       /usr/lib/jvm/java-1.8.0-openjdk-amd64
jdk1.8.0_65                    1081       /usr/lib/jvm/jdk1.8.0_65

Copie o nome alternativo da primeira coluna e use-o para definir o padrão. Para definir jdk1.8.0_65 como padrão, eu usaria

sudo update-java-alternatives -s jdk1.8.0_65 -v

Agora, verifique a versão java e javac .

    
por Anwar 02.11.2016 / 09:23
0

Meu PATH é de alguma forma influenciado pelo arquivo /etc/environment , como você pode ver:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

Quando executo which java e which javac , vejo o seguinte:

/usr/bin/java

Agora, não posso ter certeza de que os dois estão relacionados. * mas como desenvolvedor Java, muitas vezes adiciono coisas ao Path - é como influenciamos o CLASSPATH para que nossas classes Java estejam disponíveis. E na configuração do caminho acima, você vê este trecho:

PATH="/usr/l...sbin:/usr/bin:/sbi..."

Eu não sei o que isso significa. No entanto, seguindo as metas que me foram dadas pelo comando which , chego a um conjunto de links para executáveis. Olhando para os alvos desses links, recebo algo como:

/etc/alternatives/java

Não tem certeza sobre os próximos passos. Copie esses links, faça backup deles ou remova-os. Um pouco de tentativa e erro e Googling são os próximos passos. Eu não pesquisei a diferença entre javac -version e which , mas devo


HTH e obrigado a BryceAtNetwork23


    
por Crowie 14.02.2014 / 11:30

Tags