Problemas frequentemente encontrados

Este guia descreve como solucionar problemas frequentemente encontrados.

Falha de início no Windows

Se o JxBrowser não iniciar no Windows, certifique-se de que o ambiente cumpre os requisitos do sistema e de que nenhum software antivírus interfere com ele.

O JxBrowser executa o Chromium num processo nativo separado. Por vezes, um software antivírus ou uma política de segurança local não permite que o processo nativo seja iniciado. Embora os arquivos executáveis do JxBrowser sejam assinados com uma assinatura válida e confiável, o software antivírus pode não permitir a execução de programas que não estejam na sua lista branca.

Se as ações acima não ajudarem, ative o logging, reproduza o problema e nos forneça as mensagens de log coletadas.

Falha no início no Linux

Se o JxBrowser não iniciar no Linux, certifique-se de que o ambiente atende aos requisitos do sistema e tem as bibliotecas do sistema necessárias.

Em algumas distribuições Linux, o processo do Chromium não pode ser iniciado devido à falta de sistema. Quando isto acontece, a biblioteca grava os detalhes nos logs.

Ative o logging e verifique se as mensagens de log contém erros como este:

java.lang.UnsatisfiedLinkError: /tmp/JxBrowser/VERSION/libbrowsercore_toolkit.so:
    libgobject-2.0.so.0: cannot open shared object file: No such file or directory

Para resolver este problema, instale as bibliotecas em falta.

Se não ajudar, ative o logging, reproduza o problema e nos forneça as mensagens de log coletadas e o nome e a versão da sua distribuição Linux.

Início lento

O tempo de início depende do ambiente, do desempenho do hardware e do software antivírus instalado.

O processo de início do JxBrowser é composto por várias etapas. Primeiro, ele extrai os binários do Chromium armazenados em arquivos JAR. Em seguida, ele lança o processo principal do Chromium e estabelece a ligação entre Java e os processos do Chromium.

Normalmente, a extração dos binários do Chromium ocorre apenas uma vez no ambiente. Este passo pode atenuar consideravelmente o início. Por exemplo, demora mais ~3 segundos na máquina i7/16GB RAM/512GB SSD. Saiba como pular este passo aqui.

O software antivírus pode verificar os binários da biblioteca antes de permitir que o JxBrowser os inicie. Isto afeta negativamente o tempo de início. Tente desativar o antivírus e veja se isso ajuda.

Se não ajudar, ative o logging, reproduza o problema e nos forneça as mensagens de log coletadas e os detalhes sobre o seu hardware.

Falha no processo do Chromium

O JxBrowser executa o Chromium num processo nativo separado. Um erro neste processo pode levar a um encerramento inesperado do processo. Quando isto acontece, a biblioteca gera um ou vários arquivos de despejo de falhas. Estes arquivos são essenciais para compreender a causa da falha.

Se o processo do Chromium for encerrado inesperadamente e você receber o evento EngineCrashed, então por favor reporte o problema e anexe o(s) arquivo(s) de despejo de falha gerado(s).

Congelamento na aplicação Java

Se a sua aplicação Java for suspensa e você acredita que isso acontece devido ao JxBrowser, siga estes passos:

  1. Ative o logging.
  2. Reproduza o problema.
  3. Faça um despejo de thread quando a aplicação estiver congelada.
  4. Reporte o problema e anexe o despejo do thread coletado e as mensagens de log.

O vídeo não é reproduzido

O formato do vídeo que está tentando reproduzir pode não ser suportado pelo JxBrowser. Consulte a lista de formatos de vídeo e áudio suportados.

Se um dos formatos de vídeo suportados não for reproduzido, reporte um problema.

JMenu sobreposto

No modo de renderização Hardware Acelerado, BrowserView irá sobrepor a barra de menu:

Problema de sobreposição da barra de menus

A razão deste problema está na mistura do menu pop-up lightweight com o BrowserView heavyweight. Para resolver este problema, desative o modo lightweight dos pop-ups Swing:

JPopupMenu.setDefaultLightWeightPopupEnabled(false);
JPopupMenu.setDefaultLightWeightPopupEnabled(false)

Este código força todos os menus pop-up Swing a se tornarem heavyweight.

Utilizando o JxBrowser em Java 9+

Há casos em que o JxBrowser requer acesso a APIs não-públicas. No Java 9+, você deve conceder explicitamente este acesso ao JxBrowser. Nesta seção, enumeramos esses casos.

Incorporação no Swing

No modo de renderização HARWARE_ACCELERATED no Windows e no Linux, a biblioteca usa a API interna do JDK para atravessar corretamente o foco de entrada entre as janelas Java e Chromium.

Exportar o pacote necessário para o módulo sem nome se a sua aplicação for não modular:

--add-exports java.desktop/sun.awt=ALL-UNNAMED

Ou exportar o pacote necessário para os módulos JxBrowser se a aplicação for modular:

--add-exports java.desktop/sun.awt=jxbrowser.swing

Incorporação no JFXPanel

Se você incorporar o BrowserView no JavaFX que está dentro de JFXPanel, a biblioteca exigirá acesso à API interna do JavaFX para obter o identificador nativo da janela do aplicativo.

Exporte os pacotes necessários para o módulo sem nome se a sua aplicação for não modular:

--add-opens javafx.swing/javafx.embed.swing=ALL-UNNAMED
--add-opens javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED
--add-exports javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED
--add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED

Ou exportar os pacotes necessários para os módulos JxBrowser se a aplicação for modular:

--add-opens javafx.swing/javafx.embed.swing=jxbrowser
--add-opens javafx.graphics/com.sun.javafx.stage=jxbrowser
--add-exports javafx.graphics/com.sun.javafx.stage=jxbrowser
--add-exports javafx.controls/com.sun.javafx.scene.control=jxbrowser

Não é possível iniciar sessão na Conta Google

Uma tentativa de iniciar sessão na Conta Google pode dar origem à seguinte mensagem:

Erro de início de sessão da conta Google

A razão deste problema pode ser a porta de depuração remota. Quando a porta está configurada, o Chromium bloqueia qualquer tentativa de iniciar sessão nos seus serviços (por exemplo, Gmail, YouTube).

Sem memória no Docker

Por padrão, o Docker executa um container com um espaço de memória compartilhada /dev/shm de 64MB. Isto é muito pouco para o Chromium e causará falhas durante a renderização das páginas.

Desde a versão 7.10, o JxBrowser utiliza /dev/shm para armazenar bitmaps no modo de renderização fora da tela. Ele aloca ~10MB adicionais (1080p) ou ~40MB (4k) para cada página web para armazenar os bitmaps.

Para resolver este problema, execute o container Docker com o comando docker run --shm-size=1gb para aumentar o tamanho de /dev/shm.

Escolha a senha para o novo porta-chaves

No Linux, o Chromium pode criar um novo keyring e o sistema operacional irá mostrar esta caixa de diálogo:

Escolha a palavra-passe para o novo chaveiro

Para evitar que isso aconteça, configure o Chromium para usar o armazenamento de senhas BASIC em vez da senha do sistema:

Engine engine = Engine.newInstance(
        EngineOptions.newBuilder(renderingMode)
                     .passwordStore(PasswordStore.BASIC)
                     .build());
val engine = Engine.newInstance(
        EngineOptions.newBuilder(renderingMode)
                     .passwordStore(PasswordStore.BASIC)
                     .build())

ObjectClosedException

Objetos de serviço na biblioteca API podem ser encerrados. Uma tentativa de chamar um objeto fechado leva a uma exceção ObjectClosedException.

Neste guia, explicamos os cenários comuns em que um objeto de serviço pode ser encerrado e o que pode ser feito a esse respeito.

Motor fechado

O objeto de topo do JxBrowser é Engine. Há duas situações em que ele pode ser fechado:

  • O método Engine::close() é chamado;
  • Ocorreu um erro no processo principal do Chromium.

Se você fechar um motor, todos os objetos associados a ele, tais como perfis, navegadores, frames, etc., serão fechados automaticamente. Assim, depois do motor ser encerrado, independentemente do motivo, certifique-se de que não utiliza nenhum dos objetos associados ao motor encerrado.

Se ocorrer um erro no processo principal do Chromium, o processo será terminado e o motor será fechado. Quando isso acontece, a biblioteca gera arquivos de despejo de falhas e os salva num diretório específico. Use o evento EngineCrashed para ser notificado quando isso acontecer.

Neste caso, por favor, reporte o problema e anexe os arquivos de despejo de falhas.

Perfil excluído

Os perfis podem ser excluídos chamando o método Profiles::delete().

Se você excluir um perfil, todos os objetos associados a ele, como o armazenamento de cookies, navegadores, frames, objetos DOM/JS, etc. são encerrados automaticamente. Assim, depois de excluir um perfil, certifique-se de que não utiliza nenhum dos objetos associados ao perfil excluído.

Existem duas situações em que o Browser pode ser fechado:

  • O método Browser::close() é chamado;
  • JavaScript fecha a janela.

Se você fechar um browser, todos os objetos associados a ele, como a navegação, o localizador de texto, os frames, o DOM/JS, etc., serão fechados automaticamente. Assim, depois do browser ser fechado, certifique-se de que não utiliza nenhum dos objetos associados ao browser fechado.

O método window.close() no JavaScript só pode fechar um navegador que foi aberto por outro script. Se você espera que isto aconteça, considere checar o estado do browser antes de utilizá-lo.

Tenha em atenção que, quando o JavaScript fecha o browser, o Java o descobre com um ligeiro atraso. Se o browser já estiver fechado mas o Java ainda não tiver sido notificado, a tentativa de utilizar o browser fechado levará à ObjectClosedException.

Página Web descarregada

Cada página Web carregada tem um frame principal e frames secundários. Ao navegar para uma página Web, o browser descarrega a página anteriormente carregada e elimina todos os frames e objetos DOM/JS nela contidos.

Certifique-se de que não utiliza objetos DOM e JavaScript depois da página Web ser descarregada. Utilize os eventos de navegação para ser notificado.

Tenha em mente que o Java recebe eventos de navegação com um ligeiro atraso. Se a página já foi descarregada, mas o Java ainda não foi notificado, a tentativa de utilizar objetos excluídos/fechados levará à ObjectClosedException.

Processo de renderização terminado

No Chromium, os frames residem em processos de renderização. Quando o processo de renderização é terminado, o frame é eliminado. Quando o frame é eliminado, a página Web, os seus objetos DOM e JavaScript são eliminados e também são fechados.

Utilize o evento RenderProcessTerminated para ser notificado quando o processo for encerrado. Se o processo for terminado inesperadamente, comunique o problema e anexe os [arquivos de despejo de falhas] gerados (/pt/docs/guides/troubleshooting/crash-dumps.html).

Se ele for terminado normalmente, não é necessário qualquer ação.

Go Top