Apakah ada cara untuk memaksa maven (2.0.9) untuk memasukkan semua dependensi dalam satu file jar?
Saya punya proyek build menjadi file jar tunggal. Saya ingin kelas-kelas dari dependensi juga disalin ke dalam toples.
Pembaruan: Saya tahu bahwa saya tidak bisa hanya memasukkan file jar ke file jar. Saya mencari cara untuk membongkar guci yang ditentukan sebagai dependensi, dan mengemas file kelas ke dalam toples saya.
Jawaban:
Anda dapat melakukan ini menggunakan plugin maven-assembly dengan deskriptor "jar-dengan-dependensi". Berikut bagian yang relevan dari salah satu pom.xml kami yang melakukan ini:
sumber
attached
Tujuan sudah ditinggalkan. Thesingle
ataudirectory-single
tujuan harus lebih disukai sebagai gantinya.directory-single
sekarang sudah usang juga.Dengan Maven 2, cara yang tepat untuk melakukan ini adalah dengan menggunakan Plugin Majelis Maven2 yang memiliki file deskriptor yang telah ditentukan sebelumnya untuk tujuan ini dan yang bisa Anda gunakan pada baris perintah:
Jika Anda ingin membuat toples ini dapat dieksekusi, cukup tambahkan kelas utama untuk dijalankan ke konfigurasi plugin:
Jika Anda ingin membuat perakitan itu sebagai bagian dari proses pembuatan normal, Anda harus mengikat tujuan tunggal atau direktori-tunggal (
assembly
tujuan HANYA harus dijalankan dari baris perintah) ke fase siklus hidup (package
masuk akal), sesuatu seperti ini:Adaptasi
configuration
elemen yang sesuai dengan kebutuhan Anda (misalnya dengan hal-hal nyata seperti yang diucapkan).sumber
Jika Anda ingin melakukan file jar yang dapat dieksekusi, mereka perlu mengatur kelas utama juga. Jadi konfigurasi penuh seharusnya.
sumber
<appendAssemblyId>false</appendAssemblyId>
di dalam<configuration>
tag untuk mengecualikan akhiran "-jar-with-dependencies" di nama akhir.Ada plugin naungan naungan . Ini dapat digunakan untuk mengemas dan mengganti nama dependensi (untuk menghilangkan masalah dependensi pada classpath).
sumber
Anda dapat menggunakan tabung yang baru dibuat menggunakan
<classifier>
tag.sumber
Jika Anda (seperti saya) tidak begitu menyukai pendekatan toples-dengan-dependensi yang dijelaskan di atas, solusi pakar yang saya sukai adalah dengan hanya membangun proyek-WAR, bahkan jika itu hanya aplikasi java yang berdiri sendiri yang sedang Anda bangun:
Buat proyek jar biasa, yang akan membangun file jar Anda (tanpa dependensi).
Juga, atur proyek perang maven (dengan hanya file src / main / webapp / WEB-INF / web.xml kosong , yang akan menghindari peringatan / kesalahan dalam pembuatan maven), yang hanya memiliki proyek jar Anda sebagai ketergantungan, dan jadikan proyek jar Anda sebagai proyek
<module>
perang Anda. (Proyek perang ini hanya trik sederhana untuk membungkus semua dependensi file jar Anda menjadi file zip.)Bangun proyek perang untuk menghasilkan file perang.
Pada langkah penyebaran, cukup ganti nama file .war Anda menjadi * .zip dan unzip.
Anda sekarang harus memiliki direktori-lib (yang bisa Anda pindahkan ke tempat yang Anda inginkan) dengan toples Anda dan semua dependensi yang Anda perlukan untuk menjalankan aplikasi Anda:
(Wildcard di classpath berfungsi di Java-6 atau lebih tinggi)
Saya pikir ini lebih mudah untuk setup di maven (tidak perlu dipusingkan dengan plugin assembly) dan juga memberi Anda pandangan yang lebih jelas tentang struktur-aplikasi (Anda akan melihat nomor versi semua guci yang tergantung dalam tampilan biasa, dan hindari menyumbat semuanya menjadi satu file jar).
sumber
http://fiji.sc/Uber-JAR memberikan penjelasan yang sangat baik tentang alternatif:
sumber
META-INF/services
direktori. Info lebih lanjut di sini: maven.apache.org/plugins/maven-shade-plugin/examples/…sumber
Solusi definitif saya tentang Eclipse Luna dan m2eclipse: Custom Classloader (unduh dan tambahkan ke proyek Anda, hanya 5 kelas): http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/plain/org. eclipse.jdt.ui / jar% 20in% 20jar% 20loader / org / eclipse / jdt / internal / jarinjarloader / ; classloader ini adalah yang terbaik dari classloader satu jar dan sangat cepat;
<project.mainClass>org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader</project.mainClass> <project.realMainClass>my.Class</project.realMainClass>
Sunting di JIJConstants "Rsrc-Class-Path" ke "Class-Path"
mvn bersih dependensi: paket dependensi-salinan
dibuat jar dengan dependensi dalam folder lib dengan classloader tipis
sumber
Mengesampingkan Maven, Anda bisa menempatkan perpustakaan JAR di dalam Jar Utama tetapi Anda harus menggunakan classloader Anda sendiri.
Periksa proyek ini: Teks tautan satu-JAR
sumber
Posting ini mungkin agak lama, tetapi saya juga punya masalah yang sama baru-baru ini. Solusi pertama yang diusulkan oleh John Stauffer adalah solusi yang bagus, tetapi saya memiliki beberapa masalah saat saya bekerja pada musim semi ini. Stoples dependensi pegas yang saya gunakan memiliki beberapa file properti dan deklarasi xml-schemas yang berbagi jalur dan nama yang sama. Meskipun guci ini berasal dari versi yang sama, guci-dengan-dependensi tujuan maven adalah menimpa file tesis dengan file terakhir yang ditemukan.
Pada akhirnya, aplikasi tidak dapat memulai karena guci spring tidak dapat menemukan file properti yang benar. Dalam hal ini solusi yang diajukan oleh Rop telah memecahkan masalah saya.
Juga sejak itu, proyek spring-boot sekarang ada. Ini memiliki cara yang sangat keren untuk mengelola masalah ini dengan menyediakan tujuan pakar yang membebani tujuan paket dan menyediakan pemuat kelasnya sendiri. Lihat Panduan Referensi pegas-boot
sumber
Lihatlah jawaban ini:
Saya membuat penginstal yang dijalankan sebagai file Java JAR dan perlu membongkar file WAR dan JAR ke tempat yang sesuai di direktori instalasi. Plugin dependensi dapat digunakan dalam fase paket dengan tujuan salin dan itu akan mengunduh file apa pun di repositori Maven (termasuk file WAR) dan menuliskannya di mana pun Anda membutuhkannya. Saya mengubah direktori output ke $ {project.build.directory} / kelas dan kemudian hasil akhirnya adalah bahwa tugas JAR normal termasuk file saya baik-baik saja. Saya kemudian dapat mengekstraknya dan menuliskannya ke direktori instalasi.
sumber
Terima kasih, saya telah menambahkan potongan di bawah ini dalam file POM.xml dan masalah Mp diselesaikan dan membuat file jar lemak yang mencakup semua stoples bergantung.
sumber