Plugin Maven pour JPackage de Java 14

Bonne après-midi!

Il n'y a pas si longtemps, le nouveau Java 14 est sorti.Parmi les nombreuses fonctionnalités intéressantes, je m'intéressais à l'une d'elles, à savoir le packager jpackage (alors qu'il était dans l'incubateur).

Le sens de cette fonctionnalité est de prendre notre application, toutes les dépendances et le runtime, et d'assembler un fichier d'installation facile à distribuer, installer et exécuter.

La description de l'utilisation de l'outil se trouve dans l'article .

Après avoir joué avec le packer, j'ai voulu essayer de l'implémenter sur mon projet animal.Le projet ayant été écrit à l'aide de Maven, il a été décidé d'écrire un plugin. Comme c'est la première fois que j'écris un plugin pour Maven, cette tâche est devenue doublement intéressante pour moi.

Après avoir googlé sur le sujet des plugins, il est devenu clair que les écrire n'est pas difficile: j'ai hérité de la classe AbstractMojo , implémenté la méthode void execute () , raccroché l'annotation Mojo et le plugin est prêt.

Le résultat est un tel blanc:

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

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

"Createpackage" est le nom de la cible;
«LifecyclePhase.VERIFY» - sera effectué lors de la vérification.

Pour créer le programme d'installation .exe, vous devez exécuter la commande:

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

Autrement dit, vous devez spécifier le nom du fichier à la sortie, le dossier avec l'application et spécifier le dzharnik avec la méthode principale. Pour obtenir ces données, ajoutez les lignes suivantes à la classe:

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

La documentation indique que l'outil est disponible via java.util.spi.ToolProvider.findFirst ("jpackage") , mais je ne pouvais pas l'utiliser. Cela est peut-être dû au fait que jpackage est dans l'incubateur. Si quelqu'un connaît la solution, veuillez partager les commentaires.

Eh bien, puisque nous ne pouvons pas le faire magnifiquement, nous le ferons laid, via Runtime.getRuntime (). Exec (commande). Pour simplifier, j'ai suggéré que jpackage.exe soit ajouté aux variables d'environnement.

La commande résultante à exécuter:

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

où quelques autres drapeaux sont ajoutés : --dest dest indique l'endroit pour le résultat, --win-menu --win-shortcut ajoute des liens vers moi et vers le bureau sous Windows.

En conséquence, j'ai obtenu ce qui suit:

@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();
       }
   }
}

Dans le projet, vous pouvez vous connecter en ajoutant les lignes suivantes à 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>

Lors du test du plugin sur un projet pour animaux de compagnie, il y avait une autre surprise, à savoir, pour que le packer fonctionne sous Windows, il est nécessaire d'installer en plus WiX 3.0 ou version ultérieure.

Après avoir installé WiX, le plugin a fonctionné, ce qui m'a apporté la joie d'une petite victoire. Oui, bien qu'il soit primitif et ne fonctionne que pour Windows, mais ce n'est que le début.

Je serai heureux d'entendre des commentaires et suggestions.

Le code source se trouve sur le lien.

Documentation:

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

Merci!

All Articles