Plugin Maven para JPackage a partir de Java 14

Boa tarde!

Há pouco tempo, o novo Java 14. foi lançado. Entre muitos recursos interessantes, eu estava interessado em um, a saber, o empacotador jpackage (enquanto estava na incubadora).

O significado desse recurso é levar nosso aplicativo, todas as dependências e tempo de execução, e montar um arquivo de instalação fácil de distribuir, instalar e executar.

A descrição de como usar a ferramenta está no artigo .

Depois de brincar com o empacotador, eu queria tentar implementá-lo no meu projeto de estimação.Desde que o projeto foi escrito usando o Maven, foi decidido escrever um plugin. Como é a primeira vez que escrevo um plug-in para o Maven, essa tarefa se tornou duplamente interessante para mim.

Após pesquisar no tópico sobre plugins, ficou claro que não é difícil escrevê-los: eu herdei da classe AbstractMojo , implementei o método void execute () , desliguei a anotação Mojo e o plug-in está pronto.

O resultado é um espaço em branco:

@Mojo(name = "createpackage", defaultPhase = LifecyclePhase.VERIFY, threadSafe =true)
public class JpackageMojo extends AbstractMojo {

   @Override
   public void execute() {
        //    .
   }
}

"Createpackage" é o nome do destino;
“LifecyclePhase.VERIFY” - será executado na verificação.

Para criar o instalador .exe, você deve executar o comando:

jpackage --name myapp --input lib --main-jar main.jar

Ou seja, você precisa especificar o nome do arquivo na saída, a pasta com o aplicativo e especificar o dzharnik com o método principal. Para obter esses dados, adicione as seguintes linhas à classe:

@Parameter(defaultValue = "${project.build.directory}")
private File buildDirectory;
@Parameter( defaultValue = "${project}", readonly = true )
private MavenProject project;

A documentação diz que a ferramenta está disponível através do java.util.spi.ToolProvider.findFirst ("jpackage") , mas não foi possível usá-la. Talvez isso se deva ao fato de o jpackage estar na incubadora. Se alguém souber a solução, compartilhe nos comentários.

Bem, como não podemos fazer isso lindamente, faremos isso feio, por meio de Runtime.getRuntime (). Exec (command). Para simplificar, sugeri que o jpackage.exe fosse adicionado às variáveis ​​de ambiente.

O comando resultante para executar:

jpackage.exe --name name --input path --main-jar main --dest dest --win-menu --win-shortcut

onde mais algumas opções são adicionadas : --dest dest indica o local do resultado, --win-menu --win-shortcut adiciona links para mim e para a área de trabalho no Windows.

Como resultado, obtive o seguinte:

@Mojo(name = "createpackage", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true)
public class JpackageMojo extends AbstractMojo {

   public static final String ERROR_CREATE_PACKAGE = "Error create package";

   @Parameter(defaultValue = "${project.build.directory}")
   private File buildDirectory;
   @Parameter( defaultValue = "${project}", readonly = true )
   private MavenProject project;

   @Override
   public void execute() {
       var name = project.getArtifactId();
       var path = buildDirectory.getPath();
       var main = project.getArtifact().getFile().getName();
       var dest = path + "\\dest";
       try {
           String command  = "jpackage.exe --name " + name + " --input "
                   + path + " --main-jar " + main + " --dest " + dest
                   + " --win-menu --win-shortcut";
           getLog().debug(command);
           Process proc = Runtime.getRuntime().exec(command);
           getLog().info(Arrays.toString(proc.getInputStream().readAllBytes()));
           proc.waitFor();
           proc.destroy();
       } catch (IOException e) {
           getLog().error(ERROR_CREATE_PACKAGE, e);
       } catch (InterruptedException e) {
           getLog().error(ERROR_CREATE_PACKAGE, e);
           Thread.currentThread().interrupt();
       }
   }
}

No projeto, você pode se conectar adicionando as seguintes linhas ao pom.xml
<plugin>
   <groupId>org.sterzhen</groupId>
   <artifactId>jpackage-maven-plugin</artifactId>
   <version>1.0-SNAPSHOT</version>
   <executions>
       <execution>
           <goals>
               <goal>createpackage</goal>
           </goals>
       </execution>
   </executions>
</plugin>

Ao testar o plug-in em um projeto de estimação, houve mais uma surpresa, a saber, para o empacotador funcionar no Windows, é necessário instalar o WiX 3.0 ou posterior.

Depois de instalar o WiX, o plugin funcionou, o que me trouxe a alegria de uma pequena vitória. Sim, embora seja primitivo e funcione apenas para Windows, mas este é apenas o começo.

Ficarei feliz em ouvir comentários e sugestões.

O código fonte pode ser encontrado no link.

Documentação:

http://openjdk.java.net/jeps/343
https://docs.oracle.com/en/java/javase/14/docs/specs/man/jpackage.html
https://docs.oracle. com / pt / java / javase / 14 / jpackage / packaging-overview.htm

Obrigado!

All Articles