Plugin Maven untuk JPackage dari Java 14

Selamat sore!

Belum lama ini, Java 14 baru dirilis. Di antara banyak fitur menarik, saya tertarik pada satu, yaitu paket jpackage (saat di inkubator).

Arti dari fitur ini adalah untuk mengambil aplikasi kita, semua dependensi dan runtime, dan merakit satu file instalasi yang mudah didistribusikan, diinstal, dan dijalankan.

Deskripsi cara menggunakan alat ini ada di artikel .

Setelah bermain dengan packer, saya ingin mencoba mengimplementasikannya pada proyek kesayangan saya.Karena proyek ini ditulis menggunakan Maven, diputuskan untuk menulis sebuah plugin. Karena ini adalah pertama kalinya saya menulis sebuah plugin untuk Maven, tugas ini menjadi sangat menarik bagi saya.

Setelah googling pada topik plugin, menjadi jelas bahwa menulisnya tidak sulit: saya mewarisi dari kelas AbstractMojo , menerapkan metode void execute () , menutup anotasi Mojo , dan plugin siap.

Hasilnya kosong:

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

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

"Createpackage" adalah nama target;
"LifecyclePhase.VERIFY" - akan dilakukan saat verifikasi.

Untuk membangun installer .exe, Anda harus menjalankan perintah:

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

Artinya, Anda perlu menentukan nama file di output, folder dengan aplikasi dan menentukan dzharnik dengan metode utama. Untuk mendapatkan data ini, tambahkan baris berikut ke kelas:

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

Dokumentasi mengatakan bahwa alat ini tersedia melalui java.util.spi.ToolProvider.findFirst ("jpackage") , tapi saya tidak bisa menggunakannya. Mungkin ini karena fakta bahwa jpackage ada di dalam inkubator. Jika seseorang mengetahui solusinya, silakan bagikan dalam komentar.

Ya, karena kita tidak bisa melakukannya dengan indah, kita akan melakukannya dengan jelek, melalui Runtime.getRuntime (). Exec (perintah). Untuk mempermudah, saya menyarankan agar jpackage.exe ditambahkan ke variabel lingkungan.

Perintah yang dihasilkan untuk mengeksekusi:

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

di mana beberapa flag ditambahkan : - dest dest menunjukkan tempat untuk hasil, --win-menu --win-shortcut menambahkan tautan ke saya dan ke desktop di Windows.

Sebagai hasilnya, saya mendapat yang berikut:

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

Dalam proyek ini, Anda dapat terhubung dengan menambahkan baris berikut ke 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>

Saat menguji plugin pada proyek kesayangan, ada satu kejutan lagi, yaitu, agar paket dapat bekerja di Windows, perlu menginstal tambahan WiX 3.0 atau yang lebih baru.

Setelah menginstal WiX, plugin tersebut bekerja, yang membawa saya sukacita kemenangan kecil. Ya, sementara itu primitif dan hanya berfungsi untuk Windows, tetapi ini baru permulaan.

Saya akan senang mendengar komentar dan saran.

Kode sumber dapat ditemukan di tautan.

Dokumentasi:

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

Terima kasih!

All Articles