Cara Membuat JAR yang Boleh Dilaksanakan dengan Maven

1. Pengenalan

Dalam artikel ringkas ini, kami akan memfokuskan pada pembungkusan projek Maven ke dalam fail Jar yang dapat dilaksanakan .

Biasanya, semasa membuat fail jar , kita ingin melaksanakannya dengan mudah, tanpa menggunakan IDE; untuk tujuan itu, kami akan membincangkan konfigurasi dan kebaikan / keburukan menggunakan setiap pendekatan ini untuk membuat yang dapat dilaksanakan.

2. Konfigurasi

Untuk membuat balang yang dapat dilaksanakan , kami tidak memerlukan pergantungan tambahan. Kita hanya perlu membuat projek Maven Java, dan mempunyai sekurang-kurangnya satu kelas dengan kaedah utama (…) .

Dalam contoh kami, kami membuat kelas Java bernama ExecutableMavenJar.

Kami juga perlu memastikan bahawa pom.xml kami mengandungi unsur-unsur berikut:

4.0.0 com.baeldung core-java 0.1.0-SNAPSHOT jar

Aspek yang paling penting di sini adalah jenis - untuk membuat balang yang boleh dilaksanakan , periksa semula konfigurasi menggunakan jenis balang .

Sekarang kita boleh mula menggunakan pelbagai penyelesaian.

2.1. Konfigurasi Manual

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

Pertama, kami akan menyalin semua kebergantungan 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     

Terdapat dua aspek penting yang perlu diperhatikan. Pertama, kami menentukan ketergantungan salinan tujuan , yang memberitahu Maven untuk menyalin kebergantungan ini ke outputDirectory yang ditentukan .

Dalam kes kami, kami akan membuat folder bernama libs , di dalam direktori binaan projek (yang biasanya merupakan folder sasaran ).

Pada langkah kedua, kita akan membuat balang sedar jalan yang dapat dilaksanakan dan kelas , dengan pautan ke pergantungan yang disalin pada langkah pertama:

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

Bahagian yang paling penting dari yang disebutkan di atas adalah konfigurasi nyata . Kami menambah classpath, dengan semua kebergantungan (folder libs / ), dan memberikan maklumat mengenai kelas utama.

Harap maklum bahawa kami perlu memberikan nama kelas yang layak sepenuhnya, yang bermaksud ia akan merangkumi nama pakej.

Kelebihan dan kekurangan pendekatan ini adalah:

  • pro - proses telus, di mana kita dapat menentukan setiap langkah
  • kontra - manual, kebergantungan keluar dari balang akhir , yang bermaksud bahawa balang boleh laku anda hanya akan dijalankan jika folder libs dapat diakses dan kelihatan untuk balang

2.2. Plugin Pemasangan Apache Maven

Apache Maven Assembly Plugin membolehkan pengguna mengumpulkan hasil projek bersama dengan kebergantungannya, modul, dokumentasi laman web, dan fail lain ke dalam satu pakej yang dapat dijalankan.

Matlamat utama dalam plugin pemasangan adalah matlamat tunggal - digunakan untuk membuat semua perhimpunan (semua tujuan lain sudah tidak digunakan lagi dan akan dikeluarkan dalam rilis yang akan datang).

Mari lihat konfigurasi di pom.xml :

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

Sama seperti pendekatan manual, kita perlu memberikan maklumat mengenai kelas utama; perbezaannya ialah Maven Assembly Plugin secara automatik akan menyalin semua kebergantungan yang diperlukan ke dalam fail jar .

Dalam bahagian deskriptorRefs kod konfigurasi, kami memberikan nama, yang akan ditambahkan ke nama projek.

Hasil dalam contoh kami akan dinamakan sebagai core-java-jar-with-dependencies.jar.

  • kebaikan - kebergantungan di dalam fail balang , satu fail sahaja
  • kontra - kawalan asas pembungkusan artifak anda, misalnya, tidak ada sokongan penempatan semula kelas

2.3. Plugin Apache Maven Shade

Apache Maven Shade Plugin menyediakan kemampuan untuk mengemas artefak dalam uber-jar , yang terdiri dari semua pergantungan yang diperlukan untuk menjalankan projek. Lebih-lebih lagi, ia menyokong bayangan - iaitu menamakan semula - pakej beberapa kebergantungan.

Mari lihat konfigurasi:

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

Terdapat tiga bahagian utama konfigurasi ini:

Pertama, menandakan semua kebergantungan untuk dimasukkan ke dalam balang .

Kedua, kita perlu menentukan pelaksanaan transformer; kami menggunakan yang standard dalam contoh kami.

Akhirnya, kita perlu menentukan kelas utama aplikasi kita.

Fail keluaran akan diberi nama core-java-0.1.0-SNAPSHOT-shaded.jar , di mana core-java adalah nama projek kami, diikuti dengan versi snapshot dan nama pemalam.

  • pro - kebergantungan di dalam fail jar , kawalan lanjutan untuk mengemas artifak anda, dengan peneduhan dan penempatan semula kelas
  • kontra - konfigurasi yang kompleks (terutamanya jika kita ingin menggunakan ciri lanjutan)

2.4. Satu Jar Maven Plugin

Pilihan lain untuk membuat balang yang boleh dilaksanakan adalah projek One Jar.

Ini menyediakan pemuat kelas khusus yang tahu bagaimana memuat kelas dan sumber dari balang di dalam arkib, dan bukannya dari balang di sistem fail.

Mari lihat konfigurasi:

 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 kebergantungan yang akan dibina, 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

Dalam artikel ini, kami menerangkan banyak cara untuk membuat balang yang dapat dilaksanakan dengan pelbagai plugin Maven.

Pelaksanaan penuh tutorial ini boleh didapati di projek (jar yang dapat dieksekusi) dan ini (perang yang dapat dieksekusi).

Bagaimana untuk menguji? Untuk menyusun projek ke dalam balang yang dapat dieksekusi , jalankan Maven dengan perintah pakej bersih mvn .

Mudah-mudahan, artikel ini memberi anda lebih banyak pandangan mengenai topik tersebut dan anda akan menemui pendekatan pilihan anda bergantung pada keperluan anda.

Satu catatan akhir yang cepat - pastikan lesen balang yang anda gabungkan tidak melarang operasi seperti ini. Secara amnya, itu tidak akan berlaku, tetapi ia adalah sesuatu yang patut dipertimbangkan.