File JAR Multi-Rilis dengan Maven

1. Perkenalan

Salah satu fitur baru yang dibawa oleh Java 9 adalah kemampuan untuk membangun Multi-Release JAR (MRJAR). Seperti yang dikatakan Proposal Peningkatan JDK, ini memungkinkan kita memiliki versi khusus rilis Java yang berbeda dari kelas dalam JAR yang sama.

Dalam tutorial ini, kami menjelajahi cara mengkonfigurasi file MRJAR menggunakan Maven.

2. Maven

Maven adalah salah satu alat build yang paling banyak digunakan di ekosistem Java; salah satu kemampuannya adalah mengemas proyek menjadi JAR.

Di bagian berikut, kita akan mempelajari cara menggunakannya untuk membuat MRJAR.

3. Proyek Contoh

Mari kita mulai dengan contoh dasar.

Pertama, kita akan mendefinisikan kelas yang mencetak versi Java yang saat ini digunakan; sebelum Java 9, salah satu pendekatan yang bisa kita gunakan adalah metode System.getProperty :

public class DefaultVersion { public String version() { return System.getProperty("java.version"); } }

Sekarang, mulai dari Java 9 dan seterusnya, kita dapat menggunakan metode versi baru dari kelas Runtime :

public class DefaultVersion { public String version() { return Runtime.version().toString(); } }

Dengan metode ini, kita bisa mendapatkan instance kelas Runtime.Version yang memberi kita informasi tentang JVM yang digunakan dalam format skema string versi baru.

Plus, mari tambahkan kelas Aplikasi untuk mencatat versi:

public class App { private static final Logger logger = LoggerFactory.getLogger(App.class); public static void main(String[] args) { logger.info(String.format("Running on %s", new DefaultVersion().version())); } }

Terakhir, mari tempatkan setiap versi DefaultVersion ke dalam struktur direktori src / utamanya :

├── pom.xml ├── src │   ├── main │   │   ├── java │   │   │   └── com │   │   │   └── baeldung │   │   │   └── multireleaseapp │   │   │   ├── DefaultVersion.java │   │   │   └── App.java │   │   └── java9 │   │   └── com │   │   └── baeldung │   │   └── multireleaseapp │   │   └── DefaultVersion.java 

4. Konfigurasi

Untuk mengkonfigurasi MRJAR dari kelas-kelas di atas, kita perlu menggunakan dua plugin Maven: Plugin Compiler dan Plugin JAR.

4.1. Plugin Kompilator Maven

Di Plugin Kompilator Maven, kita perlu mengkonfigurasi satu eksekusi untuk setiap versi Java yang akan kita paketkan.

Dalam hal ini, kami menambahkan dua:

   org.apache.maven.plugins maven-compiler-plugin   compile-java-8  compile   1.8 1.8    compile-java-9 compile  compile   9  ${project.basedir}/src/main/java9  ${project.build.outputDirectory}/META-INF/versions/9      

Kami akan menggunakan eksekusi pertama compile-java-8 untuk mengkompilasi kelas Java 8 kami dan eksekusi compile-java-9 untuk mengkompilasi kelas Java 9 kami.

Kita bisa melihat bahwa itu perlu untuk mengkonfigurasi compileSourceRoot dan outputDirectory tag dengan folder masing-masing untuk versi Java 9.

Namun, pada maven-compiler-plugin 3.7.1, kita tidak perlu mengatur direktori keluaran secara manual. Sebaliknya, yang harus kita lakukan adalah mengaktifkan properti multiReleaseOutput :

 9  ${project.basedir}/src/main/java9  true 

Jika disetel ke true , plugin kompilator memindahkan semua kelas khusus rilis ke direktori META-INF / versi / $ {rilis} . Harap dicatat bahwa kami harus menyetel tag rilis ke versi Java yang diinginkan di sini, jika tidak plugin kompilator gagal .

4.2. Plugin Maven JAR

Kami menggunakan plugin JAR untuk menyetel entri Multi-Rilis ke true dalam file MANIFEST kami . Dengan konfigurasi ini, runtime Java akan melihat ke dalam folder META-INF / versi dari file JAR kami untuk kelas khusus versi; jika tidak, hanya kelas dasar yang digunakan.

Mari tambahkan konfigurasi maven-jar-plugin :

 org.apache.maven.plugins maven-jar-plugin 3.2.0    true    

5. Pengujian

Saatnya untuk menguji file JAR yang kami buat.

Saat kami mengeksekusi dengan Java 8, kami akan melihat output berikut:

[main] INFO com.baeldung.multireleaseapp.App - Running on 1.8.0_252

Tetapi jika kita mengeksekusi dengan Java 14, kita akan melihat:

[main] INFO com.baeldung.multireleaseapp.App - Running on 14.0.1+7

Seperti yang bisa kita lihat, sekarang ini menggunakan format keluaran baru. Perhatikan bahwa meskipun MRJAR kami dibuat dengan Java 9, ini kompatibel dengan beberapa versi platform Java utama.

6. Kesimpulan

Dalam tutorial singkat ini, kami melihat cara mengonfigurasi alat build Maven untuk menghasilkan MRJAR sederhana.

Seperti biasa, kode lengkap yang disajikan dalam tutorial ini tersedia di GitHub.