Cara Membuat JAR yang Dapat Dieksekusi dengan Maven

1. Perkenalan

Dalam artikel singkat ini kita akan fokus pada pengemasan proyek Maven menjadi file Jar yang dapat dieksekusi .

Biasanya, saat membuat file jar , kami ingin mengeksekusinya dengan mudah, tanpa menggunakan IDE; Untuk itu, kita akan membahas konfigurasi dan pro / kontra penggunaan masing-masing pendekatan ini untuk membuat executable.

2. Konfigurasi

Untuk membuat jar yang dapat dieksekusi , kami tidak memerlukan dependensi tambahan. Kita hanya perlu membuat proyek Java Maven, dan memiliki setidaknya satu kelas dengan metode main (…) .

Dalam contoh kami, kami membuat kelas Java bernama ExecutableMavenJar.

Kami juga perlu memastikan bahwa pom.xml kami berisi elemen berikut:

4.0.0 com.baeldung core-java 0.1.0-SNAPSHOT jar

Aspek terpenting di sini adalah jenisnya - untuk membuat jar yang dapat dieksekusi , periksa kembali konfigurasi menggunakan jenis jar .

Sekarang kita dapat mulai menggunakan berbagai solusi.

2.1. Konfigurasi Manual

Mari kita mulai dengan pendekatan manual - dengan bantuan maven-dependency-plugin .

Pertama, kami akan menyalin semua dependensi yang diperlukan ke dalam folder yang akan kami tentukan:

 org.apache.maven.plugins maven-dependency-plugin   copy-dependencies prepare-package  copy-dependencies    ${project.build.directory}/libs     

Ada dua aspek penting yang perlu diperhatikan. Pertama, kita menentukan ketergantungan salinan tujuan , yang memberitahu Maven untuk menyalin ketergantungan ini ke dalam outputDirectory yang ditentukan .

Dalam kasus kami, kami akan membuat folder bernama libs , di dalam direktori build proyek (yang biasanya merupakan folder target ).

Pada langkah kedua, kita akan membuat jar yang sadar jalur yang dapat dieksekusi dan jalur kelas , dengan tautan ke dependensi yang disalin pada langkah pertama:

 org.apache.maven.plugins maven-jar-plugin    true libs/  com.baeldung.executable.ExecutableMavenJar     

Bagian terpenting dari yang disebutkan di atas adalah konfigurasi manifes . Kami menambahkan jalur kelas, dengan semua dependensi (folder libs / ), dan memberikan informasi tentang kelas utama.

Harap dicatat, bahwa kami perlu memberikan nama kelas yang sepenuhnya memenuhi syarat, yang berarti itu akan menyertakan nama paket.

Keuntungan dan kerugian dari pendekatan ini adalah:

  • pro - proses transparan, di mana kami dapat menentukan setiap langkah
  • kontra - manual, dependensi keluar dari jar terakhir , yang berarti jar yang dapat dieksekusi hanya akan berjalan jika folder libs dapat diakses dan terlihat untuk sebuah jar

2.2. Plugin Perakitan Apache Maven

Plugin Perakitan Apache Maven memungkinkan pengguna untuk menggabungkan keluaran proyek bersama dengan dependensi, modul, dokumentasi situs, dan file lainnya ke dalam satu paket yang dapat dijalankan.

Sasaran utama dalam plugin assembly adalah satu tujuan - digunakan untuk membuat semua rakitan (semua tujuan lain tidak digunakan lagi dan akan dihapus di rilis mendatang).

Mari kita lihat konfigurasi di pom.xml :

 org.apache.maven.plugins maven-assembly-plugin   package  single      com.baeldung.executable.ExecutableMavenJar     jar-with-dependencies     

Sama halnya dengan pendekatan manual, kita perlu memberikan informasi tentang kelas utama; perbedaannya adalah Plugin Majelis Maven akan secara otomatis menyalin semua dependensi yang diperlukan ke dalam file jar .

Di bagian deskriptorRefs dari kode konfigurasi, kami memberikan nama, yang akan ditambahkan ke nama proyek.

Output dalam contoh kami akan diberi nama sebagai core-java-jar-with-dependencies.jar.

  • pro - ketergantungan di dalam file jar , hanya satu file
  • kontra - kontrol dasar untuk mengemas artefak Anda, misalnya, tidak ada dukungan relokasi kelas

2.3. Plugin Apache Maven Shade

Plugin Apache Maven Shade menyediakan kemampuan untuk mengemas artefak dalam uber-jar , yang terdiri dari semua dependensi yang diperlukan untuk menjalankan proyek. Selain itu, ia mendukung shading - yaitu rename - paket dari beberapa dependensi.

Mari kita lihat konfigurasinya:

 org.apache.maven.plugins maven-shade-plugin    shade   true   com.baeldung.executable.ExecutableMavenJar      

Ada tiga bagian utama dari konfigurasi ini:

Pertama, menandai semua dependensi yang akan dikemas ke dalam toples .

Kedua, kita perlu menentukan implementasi transformator; kami menggunakan yang standar dalam contoh kami.

Terakhir, kita perlu menentukan kelas utama aplikasi kita.

File keluaran akan diberi nama core-java-0.1.0-SNAPSHOT-shaded.jar , di mana core-java adalah nama proyek kami, diikuti dengan versi snapshot dan nama plugin.

  • pro - ketergantungan di dalam file jar , kontrol lanjutan untuk mengemas artefak Anda, dengan shading dan relokasi kelas
  • kontra - konfigurasi yang kompleks (terutama jika kita ingin menggunakan fitur lanjutan)

2.4. Plugin Satu Jar Maven

Opsi lain untuk membuat jar yang dapat dieksekusi adalah proyek One Jar.

Ini menyediakan classloader khusus yang mengetahui cara memuat kelas dan sumber daya dari jars di dalam arsip, bukan dari jars di sistem file.

Mari kita lihat konfigurasinya:

 com.jolira onejar-maven-plugin    org.baeldung.executable. ExecutableMavenJar true  ${project.build.finalName}.${project.packaging}    one-jar    

Seperti yang ditunjukkan dalam konfigurasi, kita perlu menentukan kelas utama dan melampirkan semua dependensi ke build, dengan menggunakan attachToBuild = true .

Also, we should provide the output filename. Moreover, the goal for Maven is one-jar. Please note, that One Jar is a commercial solution, that will make dependency jars not expanded into the filesystem at runtime.

  • pros – clean delegation model, allows classes to be at the top-level of the One Jar, supports external jars and can support Native libraries
  • cons – not actively supported since 2012

2.5. Spring Boot Maven Plugin

Finally, the last solution we'll look at is the Spring Boot Maven Plugin.

This allows to package executable jar or war archives and run an application “in-place”.

To use it we need to use at least Maven version 3.2. The detailed description is available here.

Let's have a look at the config:

 org.springframework.boot spring-boot-maven-plugin    repackage   spring-boot  com.baeldung.executable.ExecutableMavenJar     

There are two differences between Spring plugin and the others. First, the goal of the execution is called repackage, and the classifier is named spring-boot.

Please note, that we don't need to have Spring Boot application in order to use this plugin.

  • pros – dependencies inside a jar file, you can run it in every accessible location, advanced control of packaging your artifact, with excluding dependencies from the jar file etc., packaging of war files as well
  • cons – adds potentially unnecessary Spring and Spring Boot related classes

2.6. Web Application With Executable Tomcat

In the last part, we want to cover the topic of having a standalone web application, that is packed inside a jar file. In order to do that, we need to use different plugin, designed for creating executable jar files:

 org.apache.tomcat.maven tomcat7-maven-plugin 2.0   tomcat-run  exec-war-only  package  / false webapp.jar utf-8    

The goal is set as exec-war-only, path to your server is specified inside configuration tag, with additional properties, like finalName, charset etc. To build a jar, run man package, which will result in creating webapp.jar in your target directory. To run

To run the application, just write this in your console: java -jar target/webapp.jar and try to test it by specifying the localhost:8080/ in a browser.

  • pros – having one file, easy to deploy and run
  • cons – a size of the file is much larger, due to packing Tomcat embedded distribution inside a war file

Please note, that this is the latest version of this plugin, which supports Tomcat7 server. To avoid errors, please check that your dependency for Servlets has scope set as provided, otherwise, there will be a conflict at the runtime of executable jar:

 javax.servlet javax.servlet-api provided 

3. Conclusion

Pada artikel ini, kami menjelaskan banyak cara membuat jar yang dapat dieksekusi dengan berbagai plugin Maven.

Implementasi lengkap dari tutorial ini dapat ditemukan di proyek Github (jar yang dapat dieksekusi) ini dan (perang yang dapat dieksekusi) ini.

Bagaimana cara mengujinya? Untuk mengkompilasi proyek ke dalam jar yang dapat dieksekusi , jalankan Maven dengan perintah mvn clean package .

Semoga artikel ini memberi Anda lebih banyak wawasan tentang topik tersebut dan Anda akan menemukan pendekatan yang Anda sukai tergantung pada kebutuhan Anda.

Satu catatan terakhir singkat - pastikan lisensi toples yang Anda bundel tidak melarang operasi semacam ini. Umumnya, bukan itu masalahnya, tetapi itu adalah sesuatu yang patut dipertimbangkan.