Uber JAR, singkatnya, adalah JAR yang berisi segalanya.
Biasanya di Maven, kami mengandalkan manajemen ketergantungan. Artefak hanya berisi kelas / sumber daya itu sendiri. Maven akan bertanggung jawab untuk mengetahui semua artefak (JAR, dll) yang tergantung pada proyek saat proyek dibangun.
Uber-jar adalah sesuatu yang mengambil semua dependensi, dan mengekstrak konten dependensi dan menempatkannya dengan kelas / sumber daya dari proyek itu sendiri, dalam satu JAR besar. Dengan memiliki uber-jar seperti itu, mudah untuk dieksekusi, karena Anda hanya perlu satu JAR besar, bukan ton JAR kecil untuk menjalankan aplikasi Anda. Ini juga memudahkan distribusi dalam beberapa kasus.
Hanya catatan tambahan. Hindari menggunakan uber-jar sebagai ketergantungan Maven, karena merusak fitur resolusi ketergantungan Maven. Biasanya kami membuat tabung-uber hanya untuk artefak akhir untuk penyebaran aktual atau untuk distribusi manual, tetapi tidak untuk menempatkan ke repositori Maven.
Pembaruan: Saya baru saja menemukan bahwa saya belum menjawab satu bagian dari pertanyaan: "Apa gunanya mengubah nama paket dependensi?". Berikut adalah beberapa pembaruan singkat dan mudah-mudahan akan membantu orang yang memiliki pertanyaan serupa.
Membuat uber-jar untuk kemudahan penempatan adalah salah satu contoh penggunaan plugin teduh. Ada juga kasus penggunaan umum lainnya yang melibatkan penggantian nama paket.
Sebagai contoh, saya sedang mengembangkan Foo
perpustakaan, yang tergantung pada versi tertentu (mis. 1.0) Bar
perpustakaan. Dengan asumsi saya tidak dapat menggunakan versi Bar
lib lainnya (karena perubahan API, atau masalah teknis lainnya, dll). Jika saya hanya menyatakan Bar:1.0
sebagai Foo
dependensi dalam Maven, adalah mungkin untuk jatuh ke dalam masalah: Sebuah Qux
proyek tergantung pada Foo
, dan juga Bar:2.0
(dan itu tidak dapat digunakan Bar:1.0
karena Qux
perlu menggunakan fitur baru di Bar:2.0
). Inilah dilema: harus Qux
digunakan Bar:1.0
( Qux
kode mana yang tidak akan berfungsi) atau Bar:2.0
( Foo
kode mana yang tidak akan berfungsi)?
Untuk mengatasi masalah ini, pengembang Foo
dapat memilih untuk menggunakan plugin teduh untuk mengubah nama penggunaannya Bar
, sehingga semua kelas di Bar:1.0
jar disematkan dalam Foo
jar, dan paket Bar
kelas tertanam diubah dari com.bar
menjadi com.foo.bar
. Dengan demikian, Qux
dapat dengan aman bergantung pada Bar:2.0
karena sekarang Foo
tidak lagi tergantung pada Bar
, dan menggunakan salinan "diubah" sendiri yang Bar
terletak di paket lain.