A comunidade OpenJDK liberou uma versão de testes do JEP 343: Packaging Tool. O JEP 343: Packaging Tool, também conhecido como jpackage, é uma nova ferramenta para empacotar aplicações Java auto-suficientes junto com a Java Runtime Environment. Esse protótipo baseado na ferramenta javapackager do JavaFX é destinado a desenvolvedores interessados no jpackage.
Por um longo tempo, os desenvolvedores Java tem desejado construir aplicações que podem ser instaladas nativamente em uma plataforma, ao invés de distribuir jars e configurar o classpath. Com o jpackage, as aplicações Java podem ser instaladas/desinstaladas de uma forma que os usuários de uma plataforma específica estão acostumados a fazer, o jpackage suporta os formatos msi e exe no Windows, pkg e dmg no MacOS, e deb e rpm no Linux. Os usuários finais não devem notar nenhuma diferença ao instalar uma aplicação empacotada com o jpackage.
O jpackage tenta preencher a lacuna deixada por outras tecnologias como:
- javapackager, uma ferramenta distríbuida com o JDK 8 da Oracle, que foi removido no JDK 11 como parte da remoção do JavaFX;
- Java Web Start, que foi marcado como deprecated no Java 9 junto com o Java Applet Viewer e JNLP, e removido do JDK 11 da Oracle;
- pack200, uma ferramenta projetada para comprimir arquivos jar, que foi marcada como deprecated no JDK 11 para a remoção em um release futuro.
O jpackage suporta os seguintes tipos de aplicações:
- Aplicações modulares que tem uma imagem de tempo de execução customizada pelo jlink;
- Aplicações modulares que estão em arquivos jar modulares ou arquivos jmod;
- Aplicações legadas que executam no classpath, e estão em um ou mais arquivos jar.
O jpackage produz uma imagem de aplicação Java que inclui todas as dependências Java necessárias. A imagem é armazenada em um único diretório no sistema de arquivos e pode incluir o seguinte:
- Launcher nativo do aplicativo;
- Imagem da runtime do Java, incluindo os módulos do aplicativo, quando o aplicativo é modularizado;
- Recursos da aplicação, tais como jar, ico, png;
- Arquivos de configuração, tais como plist, cfg, properties.
O jpackage está previsto para ser parte do JDK 13 em um novo módulo jdk.jpackage. A interface de linha de comando (CLI) estará de acordo com o JEP 293: Guidelines for JDK Command-Line Tool Options. Além disso, é possível acessar o jpackage através do ToolProvider API (java.util.spi.ToolProvider) sob o nome "jpackage".
A interface de linha de comando do jpackage
Ao executar jpackage --help
, uma séries de informações valiosas é exibida. Vamos explorar algumas delas.
O jpackage tem dois modos:
- create-image - gera uma imagem de aplicação para uma plataforma específica;
- create-installer - gera um instalador para a aplicação para uma plataforma específica.
Para gerar uma imagem de uma aplicação modular:
jpackage create-image --output outputdir --name AppName \
--main-class package.ClassName -module moduleName -p modulePath
jpackage create-image --o outputdir -n AppName \
-c package.ClassName -m moduleName -p modulePath
Para gerar uma imagem de uma aplicação não modular:
jpackage create-image --input inputdir --output outputdir \
--name AppName --main-class package.ClassName --main-jar MyJar.jar
jpackage create-image -i inputdir -o outputdir -n AppName \
-c package.ClassName -j MyJar.jar
Para gerar um instalador para a aplicação:
jpackage create-installer -i inputdir -o outputdir \
-n -c package.ClassName -j MyJar.jar
jpackage create-installer -o outputdir -n \
--app-image
Para gerar um instalador da runtime do Java:
jpackage create-installer --runtime-installer\
--name --output outputdir
jpackage create-installer --runtime-installer \
-n -o outputdir --runtime-image
Algumas opções válidas para todas plataformas:
- --main-jar -j <main jar file> - O principal JAR da aplicação, contendo a classe principal;
- --main-class -c <class name> - Nome qualificado da classe principal do aplicativo a ser executado;
- --installer-type <type> - O tipo do instalador criado no modo create-image (msi, exe, rpm, deb, dmg, pkg, pkg-app-store) ;
- --runtime-installer - gera um instalador do Java runtime para uma plataforma específica;
- --jvm-args <java vm arguments> - Argumentos Java passados para a jvm;
- --install-dir <file path> - Caminho absoluto do diretório de instalação da aplicação.
Algumas opções válidas somente no Mac OS X:
- --mac-sign - solicita que o pacote seja assinado;
- --mac-bundle-name <name string> - Nome da aplicação que vai ser exibido no Menu Bar;
- --mac-app-store-category <category string> - Categorias na Mac App Store;
- --mac-signing-keychain <file path> - Path para o keychain.
Outros detalhes interessantes que são importantes notar em relação ao jpackage incluem:
- Suporte ao empacotamento de aplicativos Java de modo que eles sejam adequados para envio às lojas de aplicativos do Windows ou MacOS;
- Integração nativa ao definir associações de arquivos para permitir que um determinado aplicativo seja executado quando um arquivo com um sufixo associado é aberto;
- Compilação cruzada não será suportada; pacotes Windows devem ser gerados executando o jpackage no Windows;
- Tela de abertura nativa não será suportada;
- Mecanismo de auto-update não será suportado;
- O jpackage não vai estar disponível para o Solaris;
- O aplicativo Java Web Start e os recursos específicos do JavaFX não serão suportados;
- Não será disponibilizado uma interface gráfica do jpackage.
Maiores detalhes sobre o jpackage podem ser encontrados na página do JEP 343: Packaging Tool. Os desenvolvedores que quiserem testar o jpackage, podem realizar o download dos pacotes específicos para Windows, MacOS e Linux.