Um Guia para o Java Web Start

Um Guia para o Java Web Start

1. Visão geral

Este artigo explica o que é o Java Web Start (JWS), como configurá-lo no lado do servidor e como criar um aplicativo simples.

2. Introdução

JWS é um ambiente de execução que vem com o Java SE para o navegador da web do cliente e existe desde a versão 5 do Java.

Com o download dos arquivos JNLP (também conhecido como Java Network Launch Protocol) do servidor da web, esse ambiente nos permite executar pacotes JAR referenciados remotamente por ele.

Simplificando, o mecanismo carrega e executa classes Java no computador de um cliente com uma instalação JRE regular. Também permite algumas instruções extras do Java EE. No entanto, as restrições de segurança são estritamente aplicadas pelo JRE do cliente, geralmente avisando o usuário sobre domínios não confiáveis, falta de HTTPS e até mesmo JARs não assinados.

Em um site genérico, é possível baixar um arquivo JNLP para executar um aplicativo JWS. Uma vez baixado, ele pode ser executado diretamente de um atalho da área de trabalho ou do Java Cache Viewer. Depois disso, ele baixa e executa arquivos JAR.

Esse mecanismo pode ser muito útil para fornecer uma interface gráfica que não seja baseada na Web (sem HTML), como um aplicativo seguro de transferência de arquivos, uma calculadora científica, um teclado seguro, um navegador de imagens local e assim por diante.

3. Um aplicativo JNLP simples

Uma boa abordagem é gravar um aplicativo e empacotá-lo em um arquivo WAR para servidores da Web regulares. Tudo o que precisamos é escrever nosso aplicativo desejado (geralmente com Swing) e empacotá-lo em um arquivo JAR. Este JAR deve então, por sua vez, ser empacotado em um arquivo WAR junto com um JNLP que fará referência, baixará e executará a classeMain de seu aplicativo normalmente.

Não há diferença com um aplicativo Web regular empacotado em um arquivo WAR, exceto pelo fato de que precisamos de um arquivo JNLP para ativar o JWS, conforme será demonstrado abaixo.

3.1. Aplicação Java

Vamos começar escrevendo um aplicativo Java simples:

public class Hello {
    public static void main(String[] args) {
        JFrame f = new JFrame("main");
        f.setSize(200, 100);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLabel label = new JLabel("Hello World");
        f.add(label);
        f.setVisible(true);
    }
}

Podemos ver que esta é uma classe Swing bastante direta. De fato, nada foi adicionado para torná-lo compatível com o JWS.

3.2. Aplicação Web

Tudo o que precisamos é empacotar JAR este exemplo da classe Swing em um arquivo WAR junto com o seguinte arquivo JNLP:



    
        Hello
        Example
    
    
        
        
    
    

Vamos chamá-lo dehello.jndle colocá-lo em qualquer pasta da web de nosso WAR. Tanto o JAR quanto o WAR podem ser baixados, então não precisamos nos preocupar em colocar o JAR em uma pastalib.

O endereço da URL do nosso JAR final é codificado no arquivo JNLP, o que pode causar alguns problemas de distribuição. Se mudarmos os servidores de implantação, o aplicativo não funcionará mais.

Vamos consertar isso com um servlet adequado posteriormente neste artigo. Por enquanto, vamos apenas colocar o arquivo JAR para download na pasta raiz comoindex.html e vinculá-lo a um elemento âncora:

Let’s also set the main class in our JAR Manifest. Isso pode ser feito configurando o plugin JAR no arquivopom.xml. Da mesma forma, movemos o arquivo JAR para fora deWEB-INF/lib, uma vez que se destina apenas para download, ou seja, não para o classloader:


    org.apache.maven.plugins
    maven-jar-plugin
    ...
    
        
            compile
            
                jar
            
            
                
                    
                        
                            com.example.Hello
                        
                    
                
                
                    ${project.basedir}/target/jws
                
            
        
    

4. Configurações Especiais

4.1. Problemas de segurança

Para executar um aplicativo,we need to sign the JAR. Criar um certificado válido e usar o plug-in JAR Sign Maven vai além do escopo deste artigo, mas podemos ignorar esta política de segurança para fins de desenvolvimento ou se tivermos acesso administrativo ao computador de nosso usuário.

Para fazer isso, precisamos adicionar a URL local (por exemplo:http://localhost:8080) à lista de exceções de segurança da instalação do JRE no computador onde o aplicativo será executado. Pode ser encontrado abrindo o Painel de Controle Java (no Windows, podemos encontrá-lo através do Painel de Controle) na guia Segurança.

5. OJnlpDownloadServlet

5.1. Algoritmos de compressão

Existe um servlet especial que pode ser incluído em nossa WAR. Ele otimiza o download procurando a versão compilada mais compactada de nosso arquivo JAR, se disponível, e também corrige o valorcodebase codificado no arquivo JLNP.

Como nosso JAR estará disponível para download, é aconselhável empacotá-lo com um algoritmo de compactação, como Pack200, e entregar o JAR normal e qualquer versão compactada JAR.PACK.GZ ou JAR.GZ na mesma pasta para que este servlet possa escolha a melhor opção para cada caso.

Infelizmente, ainda não existe uma versão estável de um plugin Maven para este algoritmo de compressão, mas podemos trabalhar com o executável Pack200 que vem com o JRE (geralmente, instalado no caminho{JAVA_SDK_HOME}/jre/bin/).

Sem alterar nosso JNLP e colocando as versõesjar.gzejar.pack.gz do JAR na mesma pasta, o servlet escolhe a melhor uma vez que recebe uma chamada de um JNLP remoto. Isso aprimora a experiência do usuário e otimiza o tráfego de rede.

5.2. Substituição dinâmica de codebase

O servlet também pode realizar substituições dinâmicas para URLs codificados permanentemente na tag<jnlp spec=”1.0+” codebase=”http://localhost:8080/jnlp-example”>. Ao alterar o JNLP para o caractere curinga<jnlp spec=”1.0+” codebase=”$$context”>, ele entrega a mesma tag final renderizada.

O servlet também funciona com os caracteres curingacodebase_, _hostname,name_ and _site, que resolverão “http://localhost:8080/jnlp-example/“, “localhost:8080“, “hello.jnlp“ e “http://localhost:8080 ”respectivamente.

5.3. Adicionando o Servlet ao Classpath

Para adicionar o servlet, vamos configurar um mapeamento de servlet normal para padrões JAR e JNLP para nossoweb.xml:


    JnlpDownloadServlet
    
        jnlp.sample.servlet.JnlpDownloadServlet
    


    JnlpDownloadServlet
    *.jar


    JnlpDownloadServlet
    *.jnlp

O servlet em si vem em um conjunto de JARs (jardiff.jarejnlp-servlet.jar) que atualmente estão localizados na seção Demos & Samples na página de download do Java SDK.

No exemplo do GitHub, esses arquivos estão incluídos na pastajava-core-samples-lib e são incluídos como recursos da web pelo plugin Maven WAR:


    org.apache.maven.plugins
    maven-war-plugin
    ...
    
        
            
                
                    ${project.basedir}/java-core-samples-lib/
                
                
                    **/*.jar
                
                WEB-INF/lib
            
        
    

6. Pensamentos finais

O Java Web Start é uma ferramenta que pode ser usada em ambientes (intranet) onde não há servidor de aplicativos. Além disso, para aplicativos que precisam manipular arquivos de usuários locais.

Um aplicativo é enviado ao usuário final por um protocolo de download simples, sem nenhuma dependência ou configuração adicional, exceto por algumas preocupações de segurança (HTTPS, JAR assinado, etc.).

NoGit Example, o código-fonte completo descrito neste artigo está disponível para download. Podemos fazer o download diretamente do GitHub para um sistema operacional com Tomcat e Apache Maven. Após o download, precisamos executar o comandomvn install do diretório de origem e copiar o arquivojws.war gerado detarget para a pastawebapps da instalação do Tomcat.

Depois disso, podemos iniciar o Tomcat como de costume.

A partir de uma instalação padrão do Apache Tomcat, o exemplo estará disponível na URLhttp://localhost:8080/jws/index.html.