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
JCEF | JxBrowser | |
---|---|---|
Licença | Open-source | Comercial |
Superfície da API | 47 interfaces, 60 classes | 373 interfaces, 126 classes |
Toolkits de UI suportados | Swing | Swing, JavaFX, SWT, Compose Desktop |
Linguagens | Java | Java, Kotlin |
Isolamento de memória do processo Java | Não | Sim |
Lançamentos (por ano) | Sem lançamentos oficiais | 18 |
Suporte técnico | Não | Sim, 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:
- Configurar o ambiente.
- Compilar binários e classes Java.
- 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:
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.
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.
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.
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.
Enviando…
Desculpe, o envio foi interrompido
Tente novamente. Se o problema persistir, contate-nos através do endereço info@teamdev.com.
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.