Apa perbedaan antara ruang lingkup pakar compile
dan provided
ketika artefak dibangun sebagai JAR? Jika itu PERANG, saya akan mengerti - artefak akan dimasukkan atau tidak dalam WEB-INF / lib. Tetapi dalam kasus JAR tidak masalah - dependensi tidak termasuk. Mereka harus berada di classpath ketika ruang lingkup mereka compile
atau provided
. Saya tahu bahwa provided
dependensi tidak transitif - tetapi apakah hanya satu perbedaan?
260
JAR packaging
konteks. Maven doc tidak menyebutkan tentang itu. Saya menggunakan Maven untuk sementara waktu, tetapi saya baru saja bertanya pada diri sendiri tentang hal itu :) Jadi sepertinya dalamJAR packaging
konteksnya, tidak ada perbedaan antaracompile
danprovided
(kecuali transisi ketergantungan). Apakah saya benar?compile
dan tidak akan jika lingkupnyaprovided
.Ini rujukannya.
sumber
mvn exec:java
dijalankan, tetapi dependensi yang dikompilasi adalah.Jika Anda berencana untuk membuat file JAR tunggal dengan semua dependensinya (tipikal xxxx-all.jar), maka berikan ruang lingkup yang penting, karena kelas-kelas di dalam lingkup ini tidak akan menjadi paket dalam JAR yang dihasilkan.
Lihat maven-assembly-plugin untuk informasi lebih lanjut
sumber
maven-assembly-plugin
, menarik bahwa jawaban yang paling banyak dipilih tidak menyebutkannya.Jadikan tersedia ke jalur kelas, jangan tambahkan ketergantungan ini ke jar final jika itu adalah jar normal; tetapi tambahkan toples ini ke toples jika toples terakhir adalah toples tunggal (misalnya, toples yang dapat dieksekusi)
Ketergantungan akan tersedia di lingkungan run time jadi jangan tambahkan ketergantungan ini dalam hal apa pun; bahkan tidak dalam satu toples (yaitu toples yang dapat dieksekusi dll)
sumber
Untuk file jar, perbedaannya ada pada classpath yang tercantum dalam file MANIFEST.MF yang termasuk dalam jar jika addClassPath disetel ke true dalam konfigurasi maven-jar-plugin. dependensi 'kompilasi' akan muncul dalam manifes, dependensi 'yang disediakan' tidak akan.
Salah satu kesal saya adalah bahwa kedua kata ini harus memiliki bentuk yang sama. Baik disusun dan disediakan, atau kompilasi dan berikan.
sumber
Ketika Anda menetapkan lingkup maven sebagai
provided
, itu berarti bahwa ketika plugin berjalan, versi dependensi aktual yang digunakan akan tergantung pada versi Apache Maven yang telah Anda instal.sumber
Jika file jar seperti file jar boot spring yang dapat dieksekusi, maka cakupan semua dependensi harus
compile
mencakup semua file jar.Tetapi jika file jar digunakan dalam paket atau aplikasi lain maka itu tidak perlu menyertakan semua dependensi dalam file jar karena paket atau aplikasi ini dapat menyediakan dependensi lain sendiri.
sumber