Complemento Maven para JPackage de Java 14

¡Buenas tardes!

No hace mucho tiempo, se lanzó el nuevo Java 14. Entre muchas características interesantes, estaba interesado en una, a saber, el jpackage packer (mientras estaba en la incubadora).

El significado de esta característica es tomar nuestra aplicación, todas las dependencias y el tiempo de ejecución, y ensamblar un archivo de instalación que sea fácil de distribuir, instalar y ejecutar.

La descripción de cómo usar la herramienta está en el artículo .

Después de jugar con el packer, quería intentar implementarlo en mi proyecto favorito.Como el proyecto se escribió con Maven, se decidió escribir un complemento. Como esta es la primera vez que escribo un complemento para Maven, esta tarea se ha vuelto doblemente interesante para mí.

Después de buscar en Google el tema de los complementos, quedó claro que escribirlos no es difícil: heredé de la clase AbstractMojo , implementé el método void execute () , colgué la anotación Mojo y el complemento está listo.

El resultado es un espacio en blanco:

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

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

"Crear paquete" es el nombre del objetivo;
"LifecyclePhase.VERIFY" : se realizará en la verificación.

Para compilar el instalador .exe, debe ejecutar el comando:

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

Es decir, debe especificar el nombre del archivo en la salida, la carpeta con la aplicación y especificar el dzharnik con el método principal. Para obtener estos datos, agregue las siguientes líneas a la clase:

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

La documentación dice que la herramienta está disponible a través de java.util.spi.ToolProvider.findFirst ("jpackage") , pero no pude usarla. Quizás esto se deba al hecho de que jpackage está en la incubadora. Si alguien conoce la solución, por favor comparta en los comentarios.

Bueno, como no podemos hacerlo bellamente, lo haremos feo, a través de Runtime.getRuntime (). Exec (comando). Para simplificar, sugerí que se agregue jpackage.exe a las variables de entorno.

El comando resultante para ejecutar:

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

donde se agregan un par de banderas más: --dest dest indica el lugar para el resultado, --win-menu --win-shortcut agrega enlaces a mí y al escritorio en Windows.

Como resultado, obtuve lo siguiente:

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

En el proyecto, puede conectarse agregando las siguientes líneas a 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>

Al probar el complemento en un proyecto favorito, hubo una sorpresa más, es decir, para que el empacador funcione en Windows, es necesario instalar adicionalmente WiX 3.0 o posterior.

Después de instalar WiX, el complemento funcionó, lo que me trajo la alegría de una pequeña victoria. Sí, aunque es primitivo y funciona solo para Windows, pero esto es solo el comienzo.

Estaré encantado de escuchar comentarios y sugerencias.

El código fuente se puede encontrar en el enlace.

Documentación:

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

Gracias!

All Articles