Friday, February 01, 2013

Como gerar um jar assinado (sign) com o Maven

Aplicações desktop em Java (Swing, JavaFX, ...), podem ser distribuídas e instaladas de forma eficiente, através do Java Web Start. O Java Web Start é um mecanismo que roda local, na máquina do cliente, com ele é possível fazer o download (JAR) e executar a aplicaçãode forma "quase transparente".

O "quase transparente" ocorre uma vez que essa modalidade de distribuição impõe algumas regras de segurança. Alguns recursos, como o uso de I/O, exigem que o JAR seja assinado (sign) com um certificado, garantindo ao usuário a autenticidade da aplicação.

O kit de desenvolvimento Java, disponibiliza o jarsigner. Um programa que cria e verifica certificados em arquivos JAR. A boa notícia é que projetos desenvolvidos com o Maven, também podem contar com esse recurso!

Através do plugin Jarsigner, é possível indicar ao Maven que durante o build do projeto o JAR deverá ser assinado com um determinado certificado. A seguir o trecho do pom.xml com as definições do Maven para assinar o JAR:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <!-- definicoes do artefato e dependencias omitidas -->

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jarsigner-plugin</artifactId>
        <version>1.2</version>
        <executions>
          <execution>
            <id>sign</id>
            <phase>package</phase>
            <goals>
              <goal>sign</goal>
            </goals>
          </execution>
        </executions>

        <configuration>
          <keystore>/home/yaw</keystore>
          <alias>key</alias>
          <storepass>mykeypass</storepass>
          <keypass>mykeypass</keypass>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Note o trecho que configuraç a execução do plugin, a tag phase indica que o JAR do projeto deve ser assinado durante a fase package do build. Outro detalhe é que nas configurações indicamos as propriedades do certificado:
  • keystore: local (diretório) aonde a chave foi armazenada;
  • alias: nome da chave;
  • storepass e keypass: senha de acesso da chave;
Caso a aplicação, distribuída pelo Java Web Start, seja assinado as dependências também devem ser assinadas. Ou seja, todos os JARs complementares ao projeto também devem ser assinados. Com o jarsigner podemos assinar JARs terceiros, o mesmo vale para o plugin do Maven.

Na YaW desenvolvemos alguns projetos para demonstração que utilizam essa abordagem. Veja e execute o projeto Aplicação Desktop com Swing e JPA/Hibernate. Saiba mais detalhes sobre o Java Web Start no tutorial online da Oracle.

@edermag