Maven Plugin für JPackage aus Java 14

Guten Tag!

Vor nicht allzu langer Zeit wurde das neue Java 14 veröffentlicht. Unter vielen interessanten Funktionen interessierte mich eine, nämlich der jpackage packer (im Inkubator).

Die Bedeutung dieser Funktion besteht darin, unsere Anwendung, alle Abhängigkeiten und die Laufzeit zu übernehmen und eine Installationsdatei zusammenzustellen, die einfach zu verteilen, zu installieren und auszuführen ist.

Die Beschreibung zur Verwendung des Tools finden Sie im Artikel .

Nachdem ich mit dem Packer gespielt hatte, wollte ich versuchen, ihn in meinem Haustierprojekt zu implementieren.Da das Projekt mit Maven geschrieben wurde, wurde beschlossen, ein Plugin zu schreiben. Da ich zum ersten Mal ein Plugin für Maven schreibe, ist diese Aufgabe für mich doppelt interessant geworden.

Nachdem ich über das Thema Plugins gegoogelt hatte, wurde klar, dass es nicht schwierig war, sie zu schreiben: Ich habe von der AbstractMojo- Klasse geerbt , die void execute () -Methode implementiert , die Mojo- Annotation aufgehängt und das Plugin war fertig.

Das Ergebnis ist so leer:

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

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

"Createpackage" ist der Name des Ziels.
"LifecyclePhase.VERIFY" - wird bei der Überprüfung ausgeführt.

Um das EXE-Installationsprogramm zu erstellen, müssen Sie den folgenden Befehl ausführen:

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

Das heißt, Sie müssen den Dateinamen an der Ausgabe, den Ordner mit der Anwendung und die dzharnik mit der Hauptmethode angeben. Fügen Sie der Klasse die folgenden Zeilen hinzu, um diese Daten zu erhalten:

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

Die Dokumentation besagt, dass das Tool über java.util.spi.ToolProvider.findFirst ("jpackage") verfügbar ist , aber ich konnte es nicht verwenden. Vielleicht liegt das daran, dass sich das Paket im Inkubator befindet. Wenn jemand die Lösung kennt, teilen Sie dies bitte in den Kommentaren mit.

Nun, da wir es nicht schön machen können, werden wir es hässlich machen, über Runtime.getRuntime (). Exec (Befehl). Der Einfachheit halber habe ich vorgeschlagen, jpackage.exe zu den Umgebungsvariablen hinzuzufügen.

Der resultierende auszuführende Befehl:

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

wo ein paar weitere Flags hinzugefügt werden : --dest dest gibt den Ort für das Ergebnis an, --win-menu --win-shortcut fügt Links zu mir und zum Desktop in Windows hinzu.

Als Ergebnis habe ich Folgendes erhalten:

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

Im Projekt können Sie eine Verbindung herstellen, indem Sie der folgenden Zeile pom.xml hinzufügen
<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>

Beim Testen des Plugins in einem Haustierprojekt gab es eine weitere Überraschung: Damit der Packer unter Windows funktioniert, muss zusätzlich WiX 3.0 oder höher installiert werden.

Nach der Installation von WiX funktionierte das Plugin, was mir die Freude über einen kleinen Sieg brachte. Ja, es ist zwar primitiv und funktioniert nur für Windows, aber dies ist nur der Anfang.

Ich freue mich über Kommentare und Vorschläge.

Den Quellcode finden Sie unter dem Link.

Dokumentation:

http://openjdk.java.net/jeps/343
https://docs.oracle.com/de/java/javase/14/docs/specs/man/jpackage.html
https://docs.oracle. com / de / java / javase / 14 / jpackage / verpackungsübersicht.htm

Danke!

All Articles