Saya ingin mengemas proyek saya dalam satu JAR yang dapat dieksekusi untuk distribusi.
Bagaimana saya bisa membuat paket proyek Maven semua JAR ketergantungan ke output JAR saya?
Saya ingin mengemas proyek saya dalam satu JAR yang dapat dieksekusi untuk distribusi.
Bagaimana saya bisa membuat paket proyek Maven semua JAR ketergantungan ke output JAR saya?
Jawaban:
dan Anda menjalankannya
Kompilasi tujuan harus ditambahkan sebelum perakitan: tunggal atau kode proyek Anda sendiri tidak termasuk.
Lihat lebih detail di komentar.
Biasanya tujuan ini terkait dengan fase pembangunan untuk dijalankan secara otomatis. Ini memastikan JAR dibangun saat menjalankan
mvn install
atau melakukan penyebaran / rilis.sumber
mvn clean compile assembly:single
.<appendAssemblyId>false</appendAssemblyId>
ke dalamconfiguration
untuk menghindari akhiran "-jar-dengan-dependensi" yang mengganggu dalam namacompile
dan kamu kacau.Anda dapat menggunakan dependensi-plugin untuk menghasilkan semua dependensi di direktori terpisah sebelum fase paket dan kemudian memasukkannya ke classpath manifes:
Atau gunakan
${project.build.directory}/classes/lib
sebagai OutputDirectory untuk mengintegrasikan semua file jar ke jar utama, tetapi kemudian Anda harus menambahkan kode classloading khusus untuk memuat stoples.sumber
${project.build.directory}/classes/lib
sebagaioutputDirectory
memiliki satu .jar utama dengan semua dependensi dalam, tapi - Cara menambahkan kode classloading kustom untuk memuat guci ini? Saya perlu membuat pelaksanaan pekerjaan seperti:java -jar main-jar-with-deps.jar
. Apakah ini mungkin?Saya membuat blog tentang beberapa cara berbeda untuk melakukan ini.
Lihat Jar yang Dapat Dieksekusi dengan Apache Maven (WordPress)
atau executable-jar-with-maven-example (GitHub)
Catatan
Pro dan kontra itu disediakan oleh Stephan .
Untuk Penggunaan Manual
Salin Dependensi ke direktori tertentu
Jadikan Jar Executable dan Classpath Sadar
Pada titik
jar
ini sebenarnya dapat dieksekusi dengan elemen classpath eksternal.Buat Arsip yang Dapat Digunakan
The
jar
file hanya executable dengan saudara...lib/
direktori. Kita perlu membuat arsip untuk disebarkan dengan direktori dan kontennya.Sekarang Anda memiliki
target/${project.build.finalName}.(zip|tar|tar.bz2|tar.gz)
yang masing-masing berisijar
danlib/*
.Plugin Majelis Apache Maven
Kamu punya
target/${project.bulid.finalName}-jar-with-dependencies.jar
.Plugin Apache Maven Shade
Kamu punya
target/${project.build.finalName}-shaded.jar
.onejar-maven-plugin
Plugin Spring Boot Maven
Kamu punya
target/${project.bulid.finalName}-spring-boot.jar
.sumber
Mengambil jawaban yang Belum Dijawab dan memformatnya kembali, kami memiliki:
Selanjutnya, saya akan merekomendasikan menjadikan ini bagian alami dari bangunan Anda, daripada sesuatu untuk memanggil secara eksplisit. Untuk menjadikan ini bagian integral dari bangunan Anda, tambahkan plugin ini ke Anda
pom.xml
dan ikat kepackage
acara siklus hidup. Namun, gotcha adalah bahwa Anda perlu memanggilassembly:single
tujuan jika meletakkan ini di pom.xml Anda, sementara Anda akan memanggil 'assembly: assembly' jika mengeksekusi secara manual dari baris perintah.sumber
Gunakan maven-shade-plugin untuk mengemas semua dependensi ke dalam satu jar-uber. Ini juga dapat digunakan untuk membangun jar yang dapat dieksekusi dengan menentukan kelas utama. Setelah mencoba menggunakan maven-assembly dan maven-jar, saya menemukan bahwa plugin ini paling sesuai dengan kebutuhan saya.
Saya menemukan plugin ini sangat berguna karena menggabungkan konten file tertentu daripada menimpa mereka. Ini diperlukan ketika ada file sumber daya yang memiliki nama yang sama di seluruh stoples dan plugin mencoba mengemas semua file sumber daya
Lihat contoh di bawah ini
sumber
Lama menggunakan plugin perakitan pakar , tapi saya tidak bisa menemukan solusi untuk masalah dengan
"already added, skipping"
. Sekarang, saya menggunakan plugin lain - onejar-maven-plugin . Contoh di bawah ini (mvn package
build toples):Anda perlu menambahkan repositori untuk plugin itu:
sumber
Anda dapat menggunakan maven-dependency-plugin, tetapi pertanyaannya adalah bagaimana membuat JAR yang dapat dieksekusi. Untuk melakukan itu diperlukan perubahan berikut pada respons Matthew Franglen (btw, menggunakan plugin dependensi lebih lama untuk dibangun ketika mulai dari target bersih):
sumber
Anda dapat menggunakan plugin maven-shade untuk membuat jar uber seperti di bawah ini
sumber
Opsi lain jika Anda benar-benar ingin mengemas kembali isi JAR lain di dalam JAR hasil tunggal Anda adalah plugin Maven Assembly . Itu membongkar dan kemudian mengemas semuanya ke dalam direktori melalui
<unpack>true</unpack>
. Maka Anda akan memiliki pass kedua yang membuatnya menjadi satu JAR besar.Opsi lain adalah plugin OneJar . Ini melakukan tindakan pengemasan ulang di atas semua dalam satu langkah.
sumber
Anda dapat menambahkan yang berikut ke pom.xml Anda :
Setelah itu Anda harus beralih melalui konsol ke direktori, di mana pom.xml berada. Maka Anda harus menjalankan mvn assembly: tunggal dan kemudian file JAR Anda yang dapat dieksekusi dengan dependensi akan dibangun. Anda dapat memeriksanya saat beralih ke direktori keluaran (target) dengan cd ./target dan memulai toples Anda dengan perintah yang serupa dengan java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar .
Saya menguji ini dengan Apache Maven 3.0.3 .
sumber
Saya memeriksa setiap respons ini dengan berusaha membuat toples lemak yang bisa dieksekusi berisi semua dependensi dan tidak ada yang berfungsi dengan baik. Jawabannya adalah plugin teduh, sangat mudah dan langsung.
Perlu diketahui bahwa dependensi Anda perlu memiliki ruang lingkup kompilasi atau runtime agar ini berfungsi dengan baik.
Contoh ini berasal dari mkyong.com
sumber
plugin
elemen berjalan dipom.xml
bawahbuild/plugins
.Anda dapat menggabungkan
maven-shade-plugin
danmaven-jar-plugin
.maven-shade-plugin
paket kelas dan semua dependensi dalam file jar tunggal.maven-jar-plugin
untuk menentukan kelas utama toples Anda yang dapat dieksekusi (lihat Menyiapkan Classpath , bab "Jadikan Jar Dapat Dieksekusi").Contoh konfigurasi POM untuk
maven-jar-plugin
:Akhirnya buat jar yang dapat dieksekusi dengan memohon:
sumber
Menurut saya, Ken Liu benar. Plugin maven dependency memungkinkan Anda untuk memperluas semua dependensi, yang kemudian dapat Anda perlakukan sebagai sumber daya. Ini memungkinkan Anda untuk memasukkannya dalam artefak utama . Penggunaan plugin rakitan membuat artefak sekunder yang sulit diubah - dalam kasus saya, saya ingin menambahkan entri manifes khusus. Pom saya berakhir sebagai:
sumber
Seharusnya seperti itu:
Pembongkaran harus dalam fase menghasilkan-sumber daya karena, jika dalam fase paket, tidak akan dimasukkan sebagai sumber daya. Coba paket bersih dan Anda akan melihat.
sumber
Ada masalah dengan mencari file assembly bersama dengan maven-assembly-plugin-2.2.1?
Coba gunakan parameter konfigurasi descriptorId daripada parameter deskriptor / descriptor atau descriptorRefs / descriptorRef.
Tak satu pun dari mereka melakukan apa yang Anda butuhkan: mencari file di classpath. Tentu saja Anda perlu menambahkan paket di mana rakitan bersama berada di classpath maven-assembly-plugin (lihat di bawah). Jika Anda menggunakan Maven 2.x (bukan Maven 3.x), Anda mungkin perlu menambahkan ketergantungan ini di pom.xml induk paling atas di bagian pluginManagement.
Lihat ini untuk lebih jelasnya.
Kelas: org.apache.maven.plugin.assembly.io.DefaultAssemblyReader
Contoh:
sumber
Untuk mengatasi masalah ini kami akan menggunakan Maven Assembly Plugin yang akan membuat JAR bersama dengan JAR ketergantungannya menjadi satu file JAR yang dapat dieksekusi. Cukup tambahkan konfigurasi plugin di bawah ini di file pom.xml Anda.
Setelah melakukan ini jangan lupa untuk menjalankan alat MAVEN dengan perintah ini mvn clean compile assembly: single
http://jkoder.com/maven-creating-a-jar-together-with-its-dependency-jars-into-a-single-executable-jar-file/
sumber
Saya tidak akan menjawab langsung pertanyaan seperti yang sudah dilakukan orang lain sebelumnya, tapi saya benar-benar bertanya-tanya apakah itu ide yang baik untuk menanamkan semua dependensi dalam toples proyek itu sendiri.
Saya melihat intinya (kemudahan penyebaran / penggunaan) tetapi itu tergantung pada kasus penggunaan dari poject Anda (dan mungkin ada alternatif (lihat di bawah)).
Jika Anda menggunakannya sepenuhnya mandiri, mengapa tidak.
Tetapi jika Anda menggunakan proyek Anda dalam konteks lain (seperti di webapp, atau jatuh di folder tempat guci lain), Anda mungkin memiliki duplikat jar di classpath Anda (yang di folder, yang di guci). Mungkin bukan penawaran, tetapi saya biasanya menghindari ini.
Alternatif yang baik:
Seperti ini, dengan pada akhirnya hanya manifes dan "utama classloader dinamis khusus", Anda dapat memulai proyek Anda dengan:
sumber
Untuk membuat JAR yang dapat dieksekusi dari baris perintah itu sendiri, cukup jalankan perintah di bawah ini dari jalur proyek:
sumber
pom.xml
selain Anda dapatkanError reading assemblies: No assembly descriptors found.
. Itulah yang terjadi pada saya.Ini adalah cara terbaik yang saya temukan:
Dengan konfigurasi ini, semua dependensi akan berlokasi di
/dependency-jars
. Aplikasi saya tidak memilikiMain
kelas, hanya konteks, tetapi salah satu dependensi saya memilikiMain
kelas (com.myDomain.etc.MainClassName
) yang memulai server JMX, dan menerima parameterstart
ataustop
. Jadi dengan ini saya dapat memulai aplikasi saya seperti ini:Saya tunggu semoga bermanfaat untuk Anda semua.
sumber
Saya membandingkan plugin pohon yang disebutkan dalam posting ini. Saya menghasilkan 2 toples dan direktori dengan semua toples. Saya membandingkan hasilnya dan tentu saja maven-shade-plugin adalah yang terbaik. Tantangan saya adalah bahwa saya memiliki banyak sumber daya pegas yang perlu digabung, serta layanan jax-rs, dan JDBC. Mereka semua digabungkan dengan benar oleh plugin warna dibandingkan dengan plugin maven-assembly-plugin. Dalam hal ini pegas akan gagal kecuali Anda menyalinnya ke folder sumber daya Anda sendiri dan menggabungkannya secara manual satu kali. Kedua plugin menghasilkan pohon ketergantungan yang benar. Saya memiliki beberapa ruang lingkup seperti tes, menyediakan, mengkompilasi, dll tes dan disediakan dilewati oleh kedua plugin. Mereka berdua menghasilkan manifes yang sama tetapi saya dapat mengkonsolidasikan lisensi dengan plugin teduh menggunakan transformator mereka. Dengan maven-dependency-plugin tentu saja Anda tidak t memiliki masalah karena guci tidak diekstraksi. Tetapi seperti yang telah ditunjukkan beberapa orang lainnya, Anda perlu membawa satu file tambahan agar berfungsi dengan baik. Ini adalah snip dari pom.xml
sumber
Sesuatu yang berhasil bagi saya adalah:
Saya memiliki kasus luar biasa karena ketergantungan saya pada sistem satu:
Saya telah mengubah kode yang disediakan oleh @ user189057 dengan perubahan: 1) maven-dependency-plugin dieksekusi di "prep-package" fase 2) Saya mengekstraksi classess yang tidak dibongkar secara langsung ke "target / class"
sumber
Saya mencoba jawaban paling banyak dipilih di sini, dan bisa mendapatkan jar runnable. Tetapi program tidak berjalan dengan benar. Saya tidak tahu alasannya. Ketika saya mencoba lari dari
Eclipse
, saya mendapatkan hasil yang berbeda tetapi ketika saya menjalankan jar dari baris perintah saya mendapatkan hasil yang berbeda (crash dengan kesalahan runtime khusus-program).Saya memiliki persyaratan yang sama dengan OP hanya bahwa saya memiliki terlalu banyak (Maven) dependensi untuk proyek saya. Untungnya, satu-satunya solusi yang berhasil bagi saya adalah menggunakan itu
Eclipse
. Sangat sederhana dan sangat mudah. Ini bukan solusi untuk OP tetapi merupakan solusi untuk seseorang yang memiliki persyaratan serupa tetapi dengan banyak ketergantungan Maven,1) Cukup klik kanan pada folder proyek Anda (di Eclipse) dan pilih
Export
2) Kemudian pilih
Java
->Runnable Jar
3) Anda akan diminta untuk memilih lokasi file jar
4) Akhirnya, pilih kelas yang memiliki metode Utama yang ingin Anda jalankan dan pilih
Package dependencies with the Jar file
dan klikFinish
sumber
Ini juga bisa menjadi pilihan, Anda dapat membuat file jar Anda
sumber
Bagi siapa pun yang mencari opsi untuk mengecualikan dependensi tertentu dari uber-jar, ini adalah solusi yang berfungsi untuk saya:
Jadi ini bukan konfigurasi mvn-assembly-plugin tetapi properti dari ketergantungan.
sumber
Sudah ada jutaan jawaban, saya ingin menambahkan Anda tidak perlu
<mainClass>
jika Anda tidak perlu menambahkan entryPoint ke aplikasi Anda. Misalnya API mungkin belum tentu memilikimain
metode.konfigurasi plugin maven
membangun
memeriksa
sumber
Tambahkan ke pom.xml:
dan
Itu dia. Paket mvn berikutnya juga akan membuat satu guci lemak, termasuk semua guci ketergantungan.
sumber
Maven-assembly-plugin bekerja sangat baik untuk saya. Saya menghabiskan berjam-jam dengan maven-dependency-plugin dan tidak bisa membuatnya bekerja. Alasan utamanya adalah bahwa saya harus mendefinisikan di bagian konfigurasi secara eksplisit item artefak yang harus dimasukkan seperti yang dijelaskan dalam dokumentasi . Ada contoh di sana untuk kasus-kasus ketika Anda ingin menggunakannya seperti:, di
mvn dependency:copy
mana tidak ada artifactItems tetapi tidak berfungsi.sumber
Posting blog ini menunjukkan pendekatan lain dengan menggabungkan plugins maven-jar dan maven-assembly. Dengan konfigurasi perakitan xml dari posting blog, itu juga dapat dikontrol jika dependensi akan diperluas atau hanya dikumpulkan dalam folder dan direferensikan oleh entri classpath di manifes:
Dan persis yang dijelaskan di sini: https://caffebig.wordpress.com/2013/04/05/executable-jar-file-with-dependent-jars-using-maven/
sumber
sumber
Oke, jadi ini solusi saya. Saya tahu ini tidak menggunakan file pom.xml. Tapi saya punya masalah programmme saya mengkompilasi dan berjalan di Netbeans tetapi gagal ketika saya mencoba Java -jar MyJarFile.jar. Sekarang, saya tidak sepenuhnya mengerti Maven dan saya pikir ini mengapa mengalami kesulitan untuk mendapatkan Netbeans 8.0.2 untuk memasukkan file jar saya di perpustakaan untuk memasukkannya ke file jar. Saya berpikir tentang bagaimana saya menggunakan file jar tanpa Maven di Eclipse.
Itu Maven yang dapat mengkompilasi semua dependanice dan plugin. Bukan Netbeans. (Jika Anda bisa mendapatkan Netbeans dan dapat menggunakan java .jar untuk melakukan ini tolong beri tahu saya caranya (^. ^) V)
[Dipecahkan - untuk Linux] dengan membuka terminal.
Kemudian
Lanjut
Lanjut
Ini akan membuat file jar di direktori target.
Sekarang
(Anda mungkin perlu menjalankan
chmod +x MyJarFile-1.0-jar-with-dependencies.jar
:)Dan akhirnya
Tolong lihat
https://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException
Saya akan memposting solusi ini pada beberapa halaman lain dengan masalah yang sama. Semoga saya bisa menyelamatkan seseorang dari rasa frustrasi selama seminggu.
sumber