(Não tinha certeza se isso deveria continuar no SU ... a migração é certamente uma opção, mas mais programadores lêem as perguntas aqui, então aqui vai).
Estou executando o Mac OS X 10.8.4 e tenho o JDK 1.6.0_51 da Apple instalado, bem como o JDK 1.7.0_25 da Oracle. Recentemente, instalei o JDK de visualização 1.8 da Oracle para alguns softwares de pré-lançamento que exigem isso. Agora, quando executo / usr / libexec / java_home, recebo o seguinte:
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
1.8.0, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home
1.7.0_25, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home
1.6.0_51-b11-457, x86_64: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
1.6.0_51-b11-457, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Ótimo.
No entanto, executando:
$ java -version
Retorna:
java version "1.8.0-ea"
Isso significa que a versão padrão do Java é atualmente a versão de pré-lançamento, o que quebra alguns pacotes "normais" (no meu caso, VisualVM).
Não consigo definir JAVA_HOME
porque o lançamento de aplicativos ignora variáveis de ambiente, mesmo ao iniciar a partir da linha de comando (por exemplo$ open /Applications/VisualVM.app
).
Então, há um arquivo que eu posso editar onde posso definir minhas preferências de pedido JVM globalmente ?
(Por favor, não me diga para iniciar o painel de preferências do Java porque isso simplesmente não funciona: ele não contém nada de útil e lista apenas uma das 4 JVMs que instalei.)
Atualização :
Oracle JVMs residem em /Library/Java/JavaVirtualMachines
. Renomear o diretório JDK 1.8 para jdk1.8.0.jvm.xyz
não muda nada: java_home
ainda o encontra no lugar certo e a execução de / usr / bin / java ainda executa a JVM 1.8. Isso não é um problema com links de sincronização, etc.
Respostas a perguntas semelhantes
Embora esta resposta ofereça o que equivale a um hack que removerá versões do Java de serem capturadas por java_home, ela ainda não responde a esta questão de como java_home escolhe seu padrão e se os usuários podem ou não configurá-lo de forma não destrutiva .
/usr/bin/java
é apenas um link simbólico/usr/bin/java
aponta para/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
. OVersions
diretório não contém um link simbólico para o JDK 1.8.0. Em vez disso, ele contém um diretório chamado útil,A
queCurrent
aponta para.A
não é um "JAVA_HOME. Ele tem um subdiretório chamadoCommands
que tem umjava
comando, mas é um binário universal opaco que faz sabe-se lá o quê. Suspeito que ele usajava_home
etc. para decidir qual JVM usar.Respostas:
Acho que
JAVA_HOME
é o melhor que você pode fazer. As ferramentas de linha de comando gostamjava
ejavac
respeitarão essa variável de ambiente, você pode usar/usr/libexec/java_home -v '1.7*'
para fornecer um valor adequado para colocar aJAVA_HOME
fim de fazer as ferramentas de linha de comando usarem Java 7.Mas os pacotes de aplicativos padrão clicáveis não usam JDKs instalados
/Library/Java
no. Os.app
pacotes de estilo antigoJavaApplicationStub
que usam o da Apple usarão o Apple Java 6 de/System/Library/Frameworks
, e os de estilo novo construídos com AppBundler sem um JRE embutido usarão o JRE "público"/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
- que está embutido no código stub e não pode ser alterado, e você não pode ter dois JREs públicos diferentes instalados ao mesmo tempo.Edit: Eu dei uma olhada no VisualVM especificamente, supondo que você esteja usando a versão "pacote de aplicativos" da página de download , e este aplicativo em particular não é um aplicativo AppBundler, em vez disso, seu executável principal é um script de shell que chama um número de outros scripts de shell e lê vários arquivos de configuração. O padrão é escolher o JDK mais novo de
/Library/Java
que seja 7u10 ou posterior, ou usar Java 6 se a instalação do Java 7 for atualização 9 ou anterior. Mas desvendando a lógica nos scripts de shell, parece-me que você pode especificar um JDK particular usando um arquivo de configuração.Crie um arquivo de texto
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
(substitua 1.3.6 por qualquer versão do VisualVM que você está usando) contendo a linhae isso o forçará a escolher Java 7 em vez de 8.
fonte
JAVA_HOME
é o caminho a seguir e, em geral, sua melhor aposta é especificar a versão secundária necessária em outros casos. Com base na desmontagem, acontece que você podeexport JAVA_VERSION=1.7
tornarjava_home
padrão a exibição de JKD7 em vez de JDK8, mas isso é interrompidojava_home -v 1.6
porque ojava-home
interpreta como uma restrição adicional e desiste devido a restrições mutuamente insatisfatórias, então apenas segue com o padrão 1.8 mesmo com a--failfast
opção.Eu estive lá também e procurei em todos os lugares como
/usr/libexec/java_home
funciona, mas não consegui encontrar nenhuma informação sobre como ele determina as Java Virtual Machines disponíveis que ele lista.Eu experimentei um pouco e acho que simplesmente executa um
ls /Library/Java/JavaVirtualMachines
e inspeciona o./<version>/Contents/Info.plist
todos os tempos de execução que encontra lá.Em seguida, ele os classifica em ordem decrescente de chave
JVMVersion
contida no Info.plist e, por padrão, usa a primeira entrada como sua JVM padrão.Acho que a única coisa que podemos fazer é mudar o plist:
sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist
e, em seguida, modificar o JVMVersion1.8.0
para outra coisa que faça com que seja classificado na parte inferior em vez de na parte superior, como!1.8.0
.Algo como:
e então desaparece magicamente do topo da lista:
Agora você precisará fazer logout / login e então:
:-)
É claro que não tenho ideia se algo mais quebrou agora ou se a versão 1.8.0-ea do java ainda funciona corretamente.
Você provavelmente não deve fazer nada disso, mas simplesmente desinstalar o 1.8.0.
No entanto, até agora isso tem funcionado para mim.
fonte
/usr/libexec/java_home -v 1.7
. Acho que vou fazer o mesmo para JAVA_HOME .../usr/bin/java
encontrará o JDK mais recente instalado e o usará para todas as ferramentas de linha de comando relacionadas ao Java no/usr/bin
.Na verdade, é muito fácil. Digamos que temos isso em nossa pasta JavaVirtualMachines:
Imagine que 1.8 é o nosso padrão, então apenas adicionamos uma nova pasta (por exemplo, 'old') e movemos a pasta jdk padrão para essa nova pasta. Faça
java -version
novamente et voila, 1.7!fonte
É muito simples, se você não se importa de arregaçar as mangas ... / Library / Java / Home é o padrão para JAVA_HOME e é apenas um link que aponta para um dos seguintes:
Então, eu queria mudar minha versão JVM / JDK padrão sem mudar o conteúdo de JAVA_HOME ... / Library / Java / Home é o local padrão para o JVM / JDK atual e é isso que eu queria preservar ... parece-me para ser a maneira mais fácil de mudar as coisas com o mínimo de efeitos colaterais.
Na verdade, é muito simples. Para alterar a versão do java que você vê com java -version, tudo o que você precisa fazer é alguma versão deste:
Eu não perdi tempo, mas um script de shell muito simples que usa / usr / libexec / java_home e ln para reposicionar o link simbólico acima deve ser estúpido fácil de criar ...
Depois de alterar para onde / Library / Java / Home está apontado ... você obtém o resultado correto:
fonte
/Library/Java/Home
é de fato um link simbólico, mas aponta para o/System/Library/Frameworks/JavaVM.framework/Home
qual está em uma grande confusão de links simbólicos que finalmente leva você a ... um comando mágico que determina o JRE certo para iniciar. Observe que/usr/libexec/java_home
também se conecta a essa magia. Portanto, você pode interromper tudo apenas substituindo os links simbólicos e apontando para um único JRE, mas terá que atualizar isso todas as vezes. Evidentemente não há nenhum comando semelhanteset_preferred_jvm_version
ou semelhante.JAVA_HOME
nenhum lugar. Vou brincar com essa técnica para ver se ela resultará na inicialização de programas baseados em Java com a VM Java "preferida". Eu suspeito que sim, mas é muito frágil..bash_profile
:export JAVA_HOME=`/usr/libexec/java_home -v 12`
As instruções de desinstalação do Oracle para Java 7 funcionaram para mim.
Excerto:
fonte
Um pouco tarde, mas como este é um problema contínuo com o Mac OSX ...
A solução mais simples que encontrei foi simplesmente remover as coisas do OpenJDK que a Apple instala. Sempre que chega uma atualização do Mac OSX, ela é instalada e você precisa removê-la novamente.
Isso funciona muito bem se você desenvolver aplicativos para o Google App Engine em seu mac usando Java. O OpenJDK não funciona bem e a versão Java que vem com a atualização do Mac OSX Yosemite fará com que o Plug-in Eclipse para App Engine trave em cada implantação com o erro útil: "Tempo limite de leitura esgotado".
fonte
Testei "jenv" e outras coisas como definir "JAVA_HOME" sem sucesso. Agora eu e acabo com a seguinte solução
(adicionado a ~ / .bashrc ou ~ / .bash.profile ou ~ / .zshrc)
E chamando assim:
java_home irá lidar com a entrada errada. então você não pode fazer algo errado. Maven e outras coisas vão pegar a versão certa agora.
fonte
Na verdade, olhei um pouco para isso no desmontador, já que a fonte não está disponível.
/ usr / bin / java e / usr / libexec / java_home usam JavaLaunching.framework. A variável de ambiente JAVA_HOME é verificada primeiro por / usr / bin / java e amigos (mas não por / usr / libexec / java_home.) A estrutura usa as variáveis de ambiente JAVA_VERSION e JAVA_ARCH para filtrar as JVMs disponíveis. Portanto, por padrão:
Mas definir, digamos, JAVA_VERSION pode substituir o padrão:
Você também pode definir JAVA_LAUNCHER_VERBOSE = 1 para ver alguns registros de depuração adicionais no que diz respeito a caminhos de pesquisa, JVMs encontrados, etc., com / usr / bin / java e / usr / libexec / java_home.
No passado, JavaLaunching.framework realmente usava o sistema de preferências (sob o domínio com.apple.java.JavaPreferences) para definir a ordem JVM preferida, permitindo que a JVM padrão fosse definida com PlistBuddy - mas o melhor que posso dizer, que o código foi removido em versões recentes do macOS. As variáveis de ambiente parecem ser a única maneira (além de editar o Info.plist nos próprios pacotes JDK).
A configuração das variáveis de ambiente padrão pode, obviamente, ser feita por meio do seu .profile ou via launchd , se você precisar que elas sejam definidas no nível da sessão.
fonte
.profile
não é útil para o meu caso de uso (iniciar um aplicativo, por exemplo, do launchpad), mas a dicalaunchd
é boa. Vou ter que tentar, já que a recente loucura de versões do Java significa que tenho várias gerações de Java instaladas simultaneamente, com níveis variados de confiança (pessoal).Editar: essas informações são para visualvm especificamente, não para qualquer outro aplicativo java
Conforme mencionado por outros, você precisa modificar o visualvm.conf
Para a versão mais recente do JvisualVM 1.3.6 no Mac, os diretórios de instalação foram alterados.
Está atualmente em /Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf .
No entanto, isso pode depender de onde você instalou o VisualVM. A maneira mais fácil de descobrir onde seu VisualVM é iniciá-lo e, em seguida, examinar o processo usando:
ps -ef | grep VisualVM
Você verá algo como:
... -Dnetbeans.dirs = / Applications / VisualVM.app / Contents / Resources / visualvm / visualvm ...
Você deseja obter a propriedade netbeans.dir e procurar um diretório e encontrará a pasta etc.
Remova o comentário desta linha no visualvm.conf e altere o caminho para o jdk
Além disso, se você está tendo lentidão com seu visualvm e tem muita memória, sugiro aumentar bastante a quantidade de memória disponível e executá-lo no modo de servidor:
fonte
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
.Eu tive uma situação semelhante, e o seguinte processo funcionou para mim:
No terminal, digite
Em seguida, adicione esta linha no arquivo e salve
onde a versão é a do seu computador, como 1.7.0_25
Saia do editor e digite o seguinte comando para torná-lo efetivo
Em seguida, digite java -version para verificar o resultado
O que é .profile? De: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515
fonte
MacOS usa / usr / libexec / java_home para encontrar a versão Java atual. Uma maneira de ignorar é alterar o arquivo plist conforme explicado por @ void256 acima. Outra maneira é fazer o backup de java_home e substituí-lo por seu próprio script java_home com o código
echo $ JAVA_HOME
Agora exporte o JAVA_HOME para a versão desejada do SDK, adicionando os seguintes comandos ao ~ / .bash_profile. export JAVA_HOME = "/ System / Library / Java / JavaVirtualMachines / 1.6.0.jdk / Contents / Home" launchctl setenv JAVA_HOME $ JAVA_HOME /// Torne a variável de ambiente global
Execute o comando source ~ / .bash_profile para executar os comandos acima.
Sempre que for necessário alterar o JAVA_HOME, ele pode redefinir o valor JAVA_HOME no arquivo ~ / .bash_profile.
fonte
Eu queria mudar a versão padrão do java de 1.6 * para 1.7 *. Tentei os seguintes passos e funcionou para mim:
ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java
Java versão "1.7.0_51"
Java (TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot (TM) 64-Bit Server VM (build 24.51-b03, modo misto)
fonte
/usr/libexec/java_home
.