Java (Português)

From ArchWiki
Status de tradução: Esse artigo é uma tradução de Java. Data da última tradução: 2020-03-29. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Do artigo do Wikipédia:

Java é uma linguagem de programação interpretada orientada a objetos desenvolvida na década de 90 por uma equipe de programadores chefiada por James Gosling, na empresa Sun Microsystems. Diferente das linguagens de programação convencionais, que são compiladas para código nativo, a linguagem Java é compilada para um bytecode que é interpretado por uma máquina virtual (Java Virtual Machine, mais conhecida pela sua abreviação JVM). A linguagem de programação Java é a linguagem convencional da Plataforma Java, mas não é a sua única linguagem.

Arch Linux oferece suporte oficial às versões de código aberto OpenJDK 8, 11 e 17. Todas essas JVM podem ser instaladas sem conflito e alternadas entre si usando o script auxiliar archlinux-java. Vários outros ambientes Java estão disponíveis no AUR, sem suporte oficial.

Instalação

Nota:
  • Arch Linux possui suporte oficial apenas à implementação OpenJDK.
  • Após a instalação, o ambiente Java precisará se reconhecido pelo shell (variável $PATH). Isso pode ser feito carregando /etc/profile pela linha de comando ou saindo e entrando novamente em um ambiente de desktop.

Os pacotes common são trazidos respectivamente como dependência, chamados de java-runtime-common (contendo arquivos comuns para Java Runtime Environments) e java-environment-common (contendo arquivos comuns para Java Development Kits). O arquivo de ambiente fornecido /etc/profile.d/jre.sh aponta para um link simbólico /usr/lib/jvm/default/bin, definido pelo script auxiliar archlinux-java. Os links /usr/lib/jvm/default e /usr/lib/jvm/default-runtime devem sempre ser editados com archlinux-java. Ele é usado para exibir e apontar para uma ambiente Java padrão em /usr/lib/jvm/java-${VERSÃO_MAIOR_JAVA}-${NOME_FORNECEDOR} ou um runtime do Java em /usr/lib/jvm/java-${VERSÃO_MAIOR_JAVA}-${NOME_FORNECEDOR}/jre.

A maioria dos executáveis da instalação do Java são fornecidos por link diretos em /usr/bin, enquanto outros estão disponíveis em $PATH. O script /etc/profile.d/jdk.sh não é mais fornecido por nenhum pacote.

OpenJDK

OpenJDK é uma implementação de código aberto do Java Platform, Standard Edition (Java SE).

JRE headless
O tempo de execução mínimo de Java - necessário para execução de programas sem GUI.
JRE completo
Ambiente de tempo de execução completo do Java - necessário para executar programa gráficos Java, depende de JRE headless.
JDK
Java Development Kit - necessário para desenvolvimento em Java, depende do JRE completo.
Versão JRE headless JRE completo JDK Documentação Fontes
OpenJDK 17 jre-openjdk-headless jre-openjdk jdk-openjdk openjdk-doc openjdk-src
OpenJDK 11 jre11-openjdk-headless jre11-openjdk jdk11-openjdk openjdk11-doc openjdk11-src
OpenJDK 8 jre8-openjdk-headless jre8-openjdk jdk8-openjdk openjdk8-doc openjdk8-src

OpenJDK GA — Compilação de General-Availability Release do OpenDJK da Oracle.

https://jdk.java.net || java-openjdk-binAUR

OpenJDK EA — Compilação de Early-Access para versão de desenvolvimento da Oracle.

https://jdk.java.net || java-openjdk-ea-binAUR

IcedTea-Web — Java Web Start e o plugin Java obsoleto para navegador.

https://icedtea.classpath.org/download/icedtea-web-docs/1.8/html/en/icedtea-web.html || icedtea-web

OpenJFX

OpenJFX é a implementação código aberto do JavaFX. Você não precisa instalar esse pacote se você está fazendo uso do Java SE (a implementação da Oracle do JRE e JDK, descritos abaixo). Esse pacote só interessa usuários da implementação código aberto de Java (projeto OpenJDK).

Versão Runtime e Desenvolvimento Documentação Fontes
OpenJFX 17 java-openjfx java-openjfx-doc java-openjfx-src
OpenJFX 11 java11-openjfx java11-openjfx-doc java11-openjfx-src
OpenJFX 8 java8-openjfxAUR java8-openjfx-docAUR java8-openjfx-srcAUR

OpenJFX GA — Compilação de General-Availability Release do OpenJFX de Gluon.

https://openjfx.io/ || java-openjfx-binAUR

OpenJFX EA — Compilação de Early-Access para versão de desenvolvimento de Gluon.

https://openjfx.io/ || java-openjfx-ea-binAUR

Outras implementações

Java SE — Implementação da Oracle de JRE e JDK.

https://www.oracle.com/technetwork/java/javase/downloads/index.html || jreAUR jre9AUR jre8AUR jre7AUR jre6AUR jdkAUR jdk9AUR jdk8AUR jdk7AUR jdk6AUR jdk-develAUR

OpenJ9 — Implementação do Eclipse de JRE, contribuído pela IBM.

https://www.eclipse.org/openj9/ || jdk-openj9-binAUR jdk13-openj9-binAUR jdk12-openj9-binAUR jdk11-openj9-binAUR jdk10-openj9-binAUR jdk9-openj9-binAUR jdk8-openj9-binAUR

IBM J9 — Implementação da IBM da oitava edição de JRE.

https://developer.ibm.com/javasdk/ || jdk8-j9-binAUR jdk7-j9-binAUR jdk7r1-j9-binAUR

Parrot VM — Uma VM com suporte experimental para Java [1] por meio de dois métodos diferentes: seja como um tradução de bytecodes de Java VM ou como um compilador Java visando a VM de Parrot.

http://www.parrot.org/ || parrotAUR
Nota: Versões de 32 bits do Java SE podem ser localizados prefixando bin32-, (por exemplo, bin32-jreAUR. Elas usam java32-runtime-commonAUR, que funciona como java-runtime-common acrescentando 32 ao final (por exemplo, java32). A mesma analogia se aplica a java32-environment-commonAUR, que é usado somente por pacotes de JDK de 32 bits.

Ferramenta de desenvolvimento

Para ambientes de desenvolvimento integrados, veja Lista de aplicativos#Ambiente de desenvolvimento integrado (IDE) e especificamente a subseção IDEs do Java.

Para desencorajar reverse engineering, um ofuscador como proguardAUR pode ser usado.

Descompiladores

  • Bytecode Viewer — Suíte de engenharia reversa de Java, incluindo um descompilador, editor e depurador.
https://bytecodeviewer.com || bytecode-viewerAUR
  • CFR — Descompilador Java, com suporte a recursos modernos de Java 9, 10 e além.
https://www.benf.org/other/cfr/ || cfrAUR
  • Fernflower — Descompilador analítico para Java, desenvolvido como parte do IntelliJ IDEA.
https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine || fernflower-gitAUR
  • JAD — Descompilador Java sem manutenção (último lançamento 2006).
https://varaneckas.com/jad || jad
  • Java Decompiler (JD-Core, JD-GUI) — Descompilador Java popular fornecendo uma interface gráfica e com suporte a Java 1-10.
https://java-decompiler.github.io/ || jd-guiAUR
  • Krakatau — Descompilador java, assembler e disassembler.
https://github.com/Storyyeller/Krakatau || krakatau-gitAUR
  • Procyon decompiler — Descompilador java experimental, inspirado por ILSpy e Mono.Cecil.
https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler || procyon-decompilerAUR, GUI: luytenAUR

Alternando entre JVM

O script auxiliar archlinux-java fornece tais funcionalidades:

archlinux-java <COMMAND>

COMMAND:
	status		List installed Java environments and enabled one
	get		Return the short name of the Java environment set as default
	set <JAVA_ENV>	Force <JAVA_ENV> as default
	unset		Unset current default Java environment
	fix		Fix an invalid/broken default Java environment configuration

Listar ambientes Java compatíveis instalados

$ archlinux-java status

Exemplo:

$ archlinux-java status
Available Java environments:
  java-7-openjdk (default)
  java-8-openjdk/jre

Note o "(default)" denotando que o java-7-openjdk está atualmente definido como padrão. Chamar java e outros binários vai depender dessa instalação do Java. Também note na saída anterior que somente a parte JRE do OpenJDK 8 está instalada aqui.

Alterar o ambiente Java padrão

# archlinux-java set <JAVA_ENV>

Exemplo:

# archlinux-java set java-8-openjdk/jre
Dica: Para ver nomes possíveis de <JAVA_ENV>, use archlinux-java status.

Note que o archlinux-java não vai deixar você definir um ambiente Java inválido. No exemplo anterior, jre8-openjdk está instalado, mas jdk8-openjdk não está, então a tentativa de definir java-8-openjdk vai falhar:

# archlinux-java set java-8-openjdk
'/usr/lib/jvm/java-8-openjdk' is not a valid Java environment path

Desconfigurar o ambiente Java padrão

Não há necessidade de remover a definição de um ambiente Java, pois os pacotes que os fornecem devem cuidar disso. Ainda assim, caso você queira fazê-lo, basta usar o comando unset:

# archlinux-java unset

Corrigir o ambiente Java padrão

Se um link inválido de ambiente Java estiver definido, executar o comando archlinux-java fix tenta corrigi-lo. Note também que, se nenhum ambiente Java padrão estiver configurado, isso fará com que busque outros válidos e tentará configurá-lo para você. O pacote oficialmente suportado "OpenJDK 8" será considerado primeiro nesta ordem, então, outros ambientes instalados.

# archlinux-java fix

Iniciar um aplicativo com uma versão Java não padrão

Se você quiser iniciar um aplicativo com outra versão do java do que o padrão (por exemplo, se você tiver as versões jre7 e jre8 instaladas no seu sistema), você pode chamar seu aplicativo em um pequeno script bash para alternar localmente o PATH padrão de Java. Por exemplo, se a versão padrão for jre7 e você quiser usar jre8:

#!/bin/sh 

export PATH="/usr/lib/jvm/java-8-openjdk/jre/bin/:$PATH"
exec /path/to/application "$@"

Pré-requisitos de pacote para ter suporte a archlinux-java

Nota: As informações abaixo também se aplicam a archlinux32-java para pacotes Java de 32 bits, com devidos acréscimos de 32 aos nome des pacote ou de executável, onde aplicável.

Esta seção é direcionada ao empacotador disposto a fornecer pacotes no AUR para uma JVM alternativa e que possa se integrar ao esquema JVM do Arch Linux para usar o archlinux-java. Para fazer isso, os pacotes devem:

  • Colocar todos os arquivos sob /usr/lib/jvm/java-${VERSÃO_MAIOR_JAVA}-${NOME_FORNECEDOR}
  • Certifique-se de que todos os executáveis para os quais java-runtime-common e java-environment-common fornecem links estejam disponíveis no pacote correspondente
  • Forneça links de /usr/bin para os executáveis somente se esses links não já pertencerem a java-runtime-common e java-environment-common
  • Acrescente ao final das páginas man -${NOME_FORNECEDOR}${VERSÃO_MAIOR_JAVA} para evitar conflitos (veja a lista de arquivos do jre8-openjdk no qual as páginas man recebem, ao final de seu nome, -openjdk8)
  • Não declare qualquer conflicts ou replaces com outras JDKs, java-runtime, java-runtime-headless ou java-environment
  • Use o script archlinux-java em funções do .install para configurar o ambiente Java como padrão Se nenhum outro ambiente Java válido estiver definido (ie: o pacote não deve forçar a instalação como padrão). Veja fontes de pacote de ambiente Java suportadas oficialmente para exemplos

Note também que:

  • Pacotes que precisam de qualquer ambiente Java devem declarar a dependência a java-runtime, java-runtime-headless ou java-environment
  • Pacotes que precisam de um fornecedor Java específico devem declarar a dependência no pacote correspondente
  • Pacotes OpenJDK agora declaram provides="java-runtime-openjdk=${pkgver}" etc. Isso permite que um pacote de terceiro declare dependência em um OpenJDK sem especificar uma versão

Solução de problemas

MySQL

Devido ao fato de que os drivers JDBC costumam usar a porta no URL para estabelecer uma conexão com o banco de dados, ele é considerado "remoto" (ou seja, o MySQL não escuta a porta de acordo com suas configurações padrão), apesar do fato de que eles estão possivelmente executando no mesmo host. Assim, para usar JDBC e MySQL, você deve habilitar o acesso remoto ao MySQL, seguindo as instruções em MariaDB#Grant remote access.

IntelliJ IDEA

Se Intellij IDEA apresentou The selected directory is not a valid home for JDK com o caminho Java SDK do sistema, você pode ter que instalar um pacote JDK diferente e selecioná-lo como JDK do IntelliJ.

Personificar outro gerenciador de janela

Você pode usar o wmname do suckless.org para fazer a JVM acreditar que você está executando em um gerenciador de janela diferente. Isso pode resolver um problema de renderização das GUIs Java ocorrendo em gerenciadores de janela, como o Awesome, Dwm ou Ratpoison. Tente definir "compiz" ou "LG3D"

$ wmname compiz

Você deve reiniciar o aplicativo em questão após executar o comando wmname.

Isso funciona porque a JVM contém uma lista codificada de gerenciadores de janela non-re-parenting (que não registram novas janelas como de topo de nível) conhecidos. Para a máxima ironia, alguns usuários preferem personificar LG3D, o gerenciador de janela non-re-parenting escrito pela Sun, em Java.

Fontes ilegíveis

Além das sugestões mencionadas abaixo em #Melhor renderização de fonte, algumas fontes ainda pode não estar legíveis depois. Se esse for o caso, há uma grande chance das fontes da Microsoft estarem sendo usadas. Instale ttf-ms-fontsAUR.

Faltando texto em alguns aplicativos

Se alguns aplicativos estão faltando textos completos, pode ajudar a usar as opções em #Dicas e truques como sugerido em FS#40871.

Janela cinza, aplicações sem redimensionamento com o WM, menus fechando imediatamente

O kit de ferramentas padrão de GUI do Java possui uma lista codificada de gerenciadores de janela "não-reparenting". Se estiver usando um que não esteja nessa lista, pode haver alguns problemas com a execução de alguns aplicativos Java. Um dos problemas mais comuns é "blobs cinzas", quando o aplicativo Java se renderiza como uma caixa cinzenta simples em vez de renderizar a interface gráfica esperada. Outro pode ser menus respondendo ao seu clique, mas fechando imediatamente.

Há várias coisas que podem ajudar:

  • Para jre8-openjdk, acrescente a linha export _JAVA_AWT_WM_NONREPARENTING=1 em /etc/profile.d/jre.sh. Então, carregue o arquivo /etc/profile.d/jre.sh ou encerre a sessão e incie-a novamente.
  • Para a última versão do JDK, acrescente a line export AWT_TOOLKIT=MToolkit em ~/.xinitrc antes do exec do gereciador de janela.
  • Também, você pode tentar usar wmname com a linha wmname compiz em seu ~/.xinitrc.
  • Para JRE/JDK da Oracle, use SetWMName. Porém, seu efeito pode ser cancelado ao usar também XMonad.Hooks.EwmhDesktops. Neste caso, acrescentar >> setWMName "LG3D" ao LogHook pode ajudar.

Veja [2] para mais informações.

Sistema congela ao depurar aplicativos JavaFX

Se o seu sistema congela durante a depuração de um aplicativo JavaFX, você pode tentar fornecer a opção JVM -Dsun.awt.disablegrab=true.

Veja https://bugs.java.com/view_bug.do?bug_id=6714678[link inativo 2021-11-12 ⓘ]

Construtor MediaPlayer do JavaFX lança uma exceção

Criar uma instância da classe MediaPlayer dos módulos de som do JavaFX pode lançar a seguinte exceção (ambos Oracle JDK e OpenJDK)

... (i.e. FXMLLoader construction exceptions) ...
Caused by: MediaException: UNKNOWN : com.sun.media.jfxmedia.MediaException: Could not create player! : com.sun.media.jfxmedia.MediaException: Could not create player!
 at javafx.scene.media.MediaException.exceptionToMediaException(MediaException.java:146)
 at javafx.scene.media.MediaPlayer.init(MediaPlayer.java:511)
 at javafx.scene.media.MediaPlayer.<init>(MediaPlayer.java:414)
 at <constructor call>
...

que resulta em algumas incompatibilidades de JavaFX com compilação moderna do ffmpeg entregada no repositório do Arch Linux.

Uma solução que funciona é instalar ffmpeg-compat-55AUR.

Veja https://www.reddit.com/r/archlinux/comments/70o8o6/using_a_javafx_mediaplayer_in_arch/

Aplicativos Java não podem abrir links externos

Se um aplicativo Java não for capaz de abrir um link para, por exemplo seu navegador web, instale gvfs. Isso é necessário pelo método Desktop.Action.BROWSE. Veja [3]

Erro ao inicializar QuantumRenderer: no suitable pipeline found

Possíveis problemas / soluções:

  • GTK2 está em falta. Instale gtk2
  • OpenJFX está em falta. Instale java-openjfx

Dicas e truques

Nota: As sugestões nesta seção são aplicáveis a todos os aplicativos, usando o runtime do Java instalado explicitamente (externo). Alguns aplicativos são agrupados com runtime próprio (privado) ou usam mecanismos próprios para GUI, renderização de fontes, etc., portanto, nenhum dos itens escritos abaixo é garantido de funcionar.

O comportamento da maioria dos aplicativos Java pode ser controlado fornecendo variáveis pré-definidas para o tempo de execução Java. Desta publicação do fórum, uma maneira de fazê-lo consiste em adicionar a seguinte linha no seu ~/.bashrc (ou /etc/profile.d/jre.sh para afetar programas que não são executados carregando ~/.bashrc, por exemplo, ao iniciar um programa a partir da visão de aplicativos do GNOME):

export _JAVA_OPTIONS="-D<opção 1> -D<opção 2>..."

Por exemplo, para usar fontes anti-alias do sistema e fazer o swing usar a aparência do GTK:

export _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'

Melhor renderização de fonte

As implementações de código fechado e de código aberto de Java são conhecidas por implementar incorretamente o anti-aliasing de fontes. Isso pode ser corrigido com as seguintes opções: -Dawt.useSystemAAFontSettings=on, -Dswing.aatext=true

Veja Fontes do Java Runtime Environment para informações mais detalhadas.

Silenciar mensagem 'Picked up _JAVA_OPTIONS' na linha de comando

Definir as variáveis de ambiente _JAVA_OPTIONS faz com que java (openjdk) escreva para stderr as mensagens da forma: 'Picked up _JAVA_OPTIONS = ...'. Para suprimir essas mensagens em seu terminal, você pode desmarcar a variável de ambiente nos arquivos de inicialização de shell e fazer um alias do java para passar as mesmas opções como argumentos de linha de comando:

_SILENT_JAVA_OPTIONS="$_JAVA_OPTIONS"
unset _JAVA_OPTIONS
alias java='java "$_SILENT_JAVA_OPTIONS"'

Visual GTK

Se seus programas Java estão com aparência ruim, você pode querer configurar a aparência padrão para componentes swing:

swing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel.

Alguns programas Java insistem em usar a aparência multiplataforma Metal. Em alguns casos você pode forçar esses aplicativos a usar o visual do GTK definindo a propriedade a seguir:

swing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel.

Suporte a GTK3

Nos lançamentos de Java anteriores à versão 9, o visual GTK é vinculado ao GTK2, enquanto muitos aplicativos de desktop mais recentes usam o GTK3. Essa incompatibilidade entre as versões do GTK pode interromper os aplicativos que utilizam os plug-ins Java com a GUI, já que a mixagem do GTK2 e do GTK3 no mesmo processo não é suportada (por exemplo, o LibreOffice 5.0).

Desde Java 9, o GTK LookAndFeel pode ser executado nas versões GTK 2, 2.2 e 3, padronizando para GTK2. Isso pode ser substituído definindo a seguinte propriedade:

jdk.gtk.version=3

Melhor desempenho 2D

Alternar para o pipeline de aceleração de hardware baseado em OpenGL melhorará o desempenho em 2D

export _JAVA_OPTIONS='-Dsun.java2d.opengl=true'
Nota: Habilitar essa opção pode fazer com que a interface do usuário de software, como os IDEs do JetBrains, se comporte mal, fazendo com que eles desenhem janelas, pop-ups e barras de ferramentas parcialmente.

Veja também