Quando se procura uma solução para apresentar HTML, executar JavaScript ou utilizar o protocolo OAuth2 em Java, é frequente procurar um navegador incorporável completo. Se optar pelo Chromium, pode utilizar JxBrowser ou Java Chromium Embedded Framework (JCEF) para integração.

Reunimos os pontos de comparação mais comuns e compilamos este guia para você. Para ajudar você a escolher entre as bibliotecas, comparamos a sua arquitetura, a funcionalidade e os esforços de integração necessários.

Você está considerando o JCEF para um projeto Eclipse/SWT? Não deixe de conferir a comparação JxBrowser ou SWT Browser.

Em poucas palavras 

CEF logo JCEF JxBrowser
LicençaOpen-sourceComercial
Superfície da API47 interfaces,
60 classes
373 interfaces,
126 classes
Toolkits de UI suportadosSwingSwing, JavaFX, SWT, Compose Desktop
LinguagensJavaJava, Kotlin
Isolamento de memória do processo JavaNãoSim
Lançamentos (por ano)Sem lançamentos oficiais18
Suporte técnicoNãoSim, confidencial com SLA.

Sendo open-source e gratuito, o JCEF pode ser uma solução viável para projetos open-source, de baixo orçamento ou acadêmicos.

No entanto, ela tem custos de manutenção. A sua equipe de desenvolvimento precisará de tempo e experiência para cobrir o que não é coberto pela comunidade JCEF:

  • Manter a infra-estrutura de construção para diferentes plataformas.
  • Criar e empacotar regularmente novas versões do JCEF.
  • Adicionar notas e assinar binários no macOS e no Windows.
  • Corrigir problemas e implementar novas funcionalidades.

O JxBrowser não necessita de manutenção. Você pode começar a utilizá-lo em cinco minutos. A biblioteca oferece mais funcionalidades e suporte nativo para todos os kits de ferramentas de IU. E se você não tiver a funcionalidade, encontrar um problema ou tiver uma pergunta, pode sempre contar com a nossa ajuda.

Como começar 

O JCEF é uma alternativa open-source ao JxBrowser. Baseia-se no Chromium Embedded Framework (CEF) e permite-lhe incorporar um navegador Web em aplicações de ambiente de trabalho Java Swing.

Para começar a utilizar o JCEF, tem de o construir você mesmo. Este processo tem três partes:

  1. Configurar o ambiente.
  2. Compilar binários e classes Java.
  3. Empacotar tudo num JAR e adicionar à sua aplicação.

O JxBrowser é uma biblioteca comercial proprietária. Para começar a utilizar o JxBrowser, adicione uma dependência única a a sua aplicação Gradle ou Maven. Ou baixe a biblioteca e adicione JxBrowser ao classpath.

Os arquivos JAR do JxBrowser contêm todos os binários necessários e não requerem ações adicionais por parte dos programadores. Os binários para macOS são autenticados e os binários para Windows são assinados.

O que está no interior 

Tanto o JxBrowser como o JCEF usam o Chromium por baixo do capô.

O JCEF é construído com base no CEF. Trata-se de uma estrutura C++ bem conhecida que também tem links para outras linguagens de programação.

O JxBrowser utiliza uma solução interna proprietária para a integração do Chromium. Não se baseia no CEF. Estamos desenvolvendo ele desde 2008 e também o utilizamos no DotNetBrowser.

Conjuntos de ferramentas de IU suportados 

A JCEF fornece um componente Swing. Se desenvolver a sua aplicação utilizando JavaFX ou SWT, terá de utilizar pontes de integração. Trata-se do SwingNode para JavaFX, e da ponte SWT_AWT para SWT.

O JxBrowser fornece componentes nativos para todos os principais kits de ferramentas de IU: JavaFX, Swing, e SWT. Veja como criar uma aplicação simples utilizando qualquer conjunto de ferramentas em no nosso Guia de Início Rápido.

Os nossos clientes também utilizam o JxBrowser nos plug-ins Eclipse RCP, IntelliJ IDEA e NetBeans.

Incorporação para desktop 

O esforço necessário para escrever uma aplicação desktop simples é semelhante para ambas as bibliotecas. Aqui está um exemplo simples:

JCEF
JxBrowser
public static void main(String[] args) {
    if (!CefApp.startup(args)) {
        System.out.println("Startup initialization failed!");
        return;
    }

    var offscreen = false;
    var settings = new CefSettings();
    settings.windowless_rendering_enabled = false;
    var cefApp = CefApp.getInstance(settings);
    var client = cefApp.createClient();
    client.addMessageRouter(CefMessageRouter.create());

    var url = "https://pt.teamdev.com/";
    var transparent = false;
    var browser = client.createBrowser(url, offscreen, transparent);

    var frame = new JFrame("JCEF");
    frame.add(browser.getUIComponent(), BorderLayout.CENTER);
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    frame.setSize(1280, 900);
    frame.setVisible(true);
}
public static void main(String[] args) {
    var engine = Engine.newInstance(HARDWARE_ACCELERATED);
    var browser = engine.newBrowser();
    browser.navigation().loadUrl("https://pt.teamdev.com/");

    SwingUtilities.invokeLater(() -> {
        var view = BrowserView.newInstance(browser);

        var frame = new JFrame("JxBrowser");
        frame.add(view, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frame.setSize(1280, 900);
        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                engine.close();
            }
        });
    });
}

Incorporação para headless 

Se a sua aplicação for executada sem IU, o JCEF não é para você. Ele requer uma IU Swing visível. Caso contrário, o browser não é completamente inicializado.

Com o JxBrowser, é possível criar um browser totalmente funcional com uma verdadeira renderização fora da tela. Veja:

public static void main(String[] args) {
    try (var engine = Engine.newInstance(OFF_SCREEN)) {
        var browser = engine.newBrowser();
        browser.resize(1280, 1024);

        browser.navigation().loadUrlAndWait("https://teamdev.com");

        // O browser está funcionando. Vamos tirar uma captura de tela e verificar.
        var bitmap = browser.bitmap();
        var image = BitmapImage.toToolkit(bitmap);
        try {
            ImageIO.write(image, "PNG", new File("screenshot.png"));
        } catch (IOException e) {
            System.out.println("Failed to save an image. " + e.getMessage());
        }
    }
}

API e funcionalidades 

O JCEF fornece uma variedade de funcionalidades para gerir a rede Chromium, a impressão, o tratamento de transferências, etc.

Superfície da API do JCEF e JxBrowser

Superfície da API do JCEF e JxBrowser.

Com o JxBrowser pode fazer o mesmo e muito mais. Nesta seção, demonstramos as funcionalidades que não estão disponíveis no JCEF.

Trabalhar com DOM 

No que diz respeito ao DOM, você tem todo o poder do browser envolvido numa API Java compreensível. Veja este exemplo ou consulte o guia.

// Encontrar nós na árvore DOM. Por um nome de etiqueta.
Lista<Element> links = document.findElementsByTagName("a");
// Por um selector CSS.
Opcional<Element> logo = document.findElementByCssSelector("#logo");
// Ou mesmo através de JavaScript.
FormElement form = document.frame().executeJavaScript("document.forms[0]");
// Acessar os atributos.
links.forEach(link -> link.attributes().put("target", "blank"));
// Enviar um formulário.
form.submit();
// Desloque-se para o elemento.
logo.ifPresent(l -> l.scrollIntoView(BOTTOM));

Interação entre JavaScript e Java 

Executar código JavaScript a partir de Java, chamar métodos Java a partir de JavaScript. E aproveite a conversão automática de tipo. Veja este exemplo ou consulte o guia.

// Obter objetos do JavaScript. Como um String.
String string = frame.executeJavaScript("'A string literal'");
// Como uma matriz.
JsArray array = frame.executeJavaScript("[0, 1, 2, 3, 4]");
// Ou como um objeto JavaScript genérico.
JsObject window = frame.executeJavaScript("window");
// Passa qualquer objeto Java para o mundo JavaScript.
window.putProperty("java", new MyJavaObject());

Emular a entrada do usuário 

Reforce os seus testes automatizados e ferramentas simulando a interação do usuário. Veja o exemplo ou consulte o guia.

var rect = buttonElement.boundingClientRect();
var center = Point.of(rect.x() + rect.width() / 2, rect.y() + rect.height() / 2);
browser.dispatch(MousePressed.newBuilder(location)
                             .button(MouseButton.PRIMARY)
                             .build());
browser.dispatch(MouseReleased.newBuilder(location)
                              .button(MouseButton.PRIMARY)
                              .build());

Codecs proprietários e Widevine 

As tecnologias proprietárias, tais como como os codecs H264, HEVC e AAC , estão desativadas por padrão, mas é muito fácil ativá-las:

var options =
        EngineOptions.newBuilder(HARDWARE_ACCELERATED)
                     .enableProprietaryFeature(ProprietaryFeature.AAC)
                     .enableProprietaryFeature(ProprietaryFeature.H_264)
                     .enableProprietaryFeature(ProprietaryFeature.WIDEVINE)
                     .build();
Engine engine = Engine.newInstance(options);

E ainda mais 

Existem dezenas de funcionalidades que só encontrará no JxBrowser. Algumas delas são:

  • Gerenciamento de perfis do Chromium;
  • Gerenciamento de senhas;
  • Preenchimento automático de formulários em uma página web;
  • A janela de visualização de impressão;
  • Suporte a SSO pronto para uso;
  • A tag HTML <datalist> no modo de renderização off-screen;
  • Arrastar e soltar no modo de renderização off-screen;
  • WebRTC e compartilhamento de tela;
  • e mais.

Arquitetura 

A principal diferença arquitetônica entre as bibliotecas é um modelo de processamento. O JCEF inicia o Chromium dentro do processo Java, enquanto o JxBrowser lança o Chromium em um processo nativo separado.

O modelo do JCEF permite-lhe inicializar o Chromium mais rapidamente, mas tem grandes desvantagens:

  • O Chromium consome a memória e a CPU do processo Java. Quanto mais instâncias do Chromium você criar, mais recursos serão retirados da sua aplicação.
  • Qualquer falha no Chromium pode causar uma falha na JVM. Uma falha na JVM encerra a sua aplicação Java com a potencial perda de dados do usuário.
  • O processo Java torna-se suscetível a vulnerabilidades de segurança no Chromium.

Arquitetura do JCEF

Arquitetura do JCEF.

O JxBrowser executa o Chromium em um processo separado e se comunica com ele através do IPC. Desta forma, o Chromium não afeta a utilização de memória do processo Java.

Se o Chromium falhar, o processo Java continuará em execução. O JxBrowser até fornece a API para que a sua aplicação saiba quando o Chromium falha. Isso oferece a capacidade de reiniciar o browser e restaurar uma sessão do usuário.

Arquitetura do JxBrowser

Arquitetura do JxBrowser.

Obter ajuda 

O JCEF é um projeto open-source. Se precisar de ajuda, pode colocar a sua questão no fórum ou criar um problema no bug tracker. Se houver uma característica que gostaria de ter, pode contribuir.

O JxBrowser é um produto comercial criado para empresas comerciais. Preocupamo-nos com os nossos clientes e prestamos serviços de suporte. Quando contatar o nosso suporte técnico, estará falando diretamente com um engenheiro que desenvolve o produto.

Se encontrar um erro, corrigi-lo-emos e fornecer-lhe-emos uma versão de pré-visualização logo a seguir. Se faltar uma funcionalidade, implementá-la-emos para você e lançá-la-emos numa das futuras versões.

Para casos avançados e pedidos personalizados, oferecemos serviços premium.

Atualizações e ciclo de lançamento 

O JxBrowser teve 16 lançamentos em 2024. Cada lançamento inclui correções e melhorias que descrevemos em detalhes nas Notas de Lançamento. Atualizamos o Chromium para a última versão estável dentro de 2–4 semanas após o seu lançamento oficial. Essas atualizações incluem os patches de segurança mais recentes e vulnerabilidades corrigidas.

O JCEF não possui um modelo de lançamento claro, e os desenvolvedores são livres para escolher um commit específico que desejam utilizar.

Spinner

Enviando…

Desculpe, o envio foi interrompido

Tente novamente. Se o problema persistir, contate-nos através do endereço info@teamdev.com.

Leia e aceite os termos para continuar.

A sua chave de avaliação pessoal de JxBrowser e o guia de início rápido chegarão à sua caixa de entrada de e-mail dentro de alguns minutos.