Untuk apa <scope> dalam <dependency> dalam pom.xml?

Jawaban:

266

The <scope>elemen dapat mengambil 6 nilai-nilai: kompilasi , disediakan , runtime , tes , sistem dan impor .

Lingkup ini digunakan untuk membatasi transitivitas ketergantungan, dan juga untuk mempengaruhi classpath yang digunakan untuk berbagai tugas pembangunan.

menyusun

Ini adalah ruang lingkup default, digunakan jika tidak ada yang ditentukan. Kompilasi dependensi tersedia di semua jalan setapak proyek. Selain itu, dependensi tersebut disebarkan ke proyek dependen.

disediakan

Ini mirip kompilasi, tetapi menunjukkan Anda mengharapkan JDK atau wadah untuk memberikan dependensi saat runtime. Misalnya, saat membuat aplikasi web untuk Java Enterprise Edition, Anda akan mengatur ketergantungan pada Servlet API dan Java EE API terkait untuk cakupan yang disediakan karena wadah web menyediakan kelas-kelas tersebut. Cakupan ini hanya tersedia pada kompilasi dan test classpath, dan tidak transitif.

runtime

Lingkup ini menunjukkan bahwa dependensi tidak diperlukan untuk kompilasi, tetapi untuk eksekusi. Itu ada di runtime dan test classpath, tetapi tidak mengkompilasi classpath.

uji

Lingkup ini menunjukkan bahwa ketergantungan tidak diperlukan untuk penggunaan normal aplikasi, dan hanya tersedia untuk fase kompilasi dan eksekusi.

sistem

Lingkup ini mirip dengan yang disediakan kecuali bahwa Anda harus memberikan JAR yang berisi secara eksplisit. Artefak selalu tersedia dan tidak dicari dalam repositori.

impor (hanya tersedia di Maven 2.0.9 atau lebih baru)

Lingkup ini hanya digunakan pada ketergantungan tipe pom di bagian ini. Ini menunjukkan bahwa POM yang ditentukan harus diganti dengan dependensi di bagian POM itu. Karena mereka diganti, dependensi dengan cakupan impor tidak benar-benar berpartisipasi dalam membatasi transitivitas ketergantungan.

Untuk menjawab bagian kedua dari pertanyaan Anda:

Bagaimana kita bisa menggunakannya untuk menjalankan tes?

Perhatikan bahwa testruang lingkup memungkinkan untuk menggunakan dependensi hanya untuk fase uji.

Baca dokumentasi untuk detail lengkap.

Ortomala Lokni
sumber
Jadi jika Anda menggunakan "test" apakah itu berakhir di .jar dibuat?
markthegrea
1
bagaimana jika ketergantungan diperlukan saat kompilasi & runtime?
Albin
23

menambahkan gambar yang bagus dengan menjelaskan cakupan

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

vaquar khan
sumber
12

Enam lingkup ketergantungan:

  • kompilasi : ruang lingkup default, classpath tersedia untuk keduanya src/maindansrc/test
  • test : classpath tersedia untuksrc/test
  • disediakan : seperti complie tetapi disediakan oleh JDK atau wadah saat runtime
  • runtime : tidak diperlukan untuk kompilasi hanya membutuhkan saat runtime
  • sistem : disediakan secara lokal menyediakan classpath
  • impor : hanya dapat mengimpor POM lain ke dalam <dependencyManagement/>, hanya tersedia di Maven 2.0.9 atau lebih baru
Premraj
sumber
4

Tag cakupan selalu digunakan untuk membatasi dependensi transitif dan ketersediaan jar di level jalur kelas. Jika kami tidak menyediakan lingkup apa pun maka lingkup default akan berfungsi yaitu Kompilasi .

Mukesh
sumber
11
Kompilasi berarti Anda membutuhkan JAR untuk mengkompilasi dan menjalankan aplikasi. Untuk aplikasi web, sebagai contoh, JAR akan ditempatkan di direktori WEB-INF / lib. Asalkan berarti Anda membutuhkan JAR untuk dikompilasi, tetapi pada saat run sudah ada JAR yang disediakan oleh lingkungan sehingga Anda tidak perlu itu JAR dikemas dengan aplikasi Anda. Untuk aplikasi web, ini berarti bahwa file JAR tidak akan ditempatkan ke direktori WEB-INF / lib. Untuk aplikasi web, jika server aplikasi sudah menyediakan JAR (atau fungsinya), maka gunakan "asalkan" jika tidak gunakan "kompilasi".
Mukesh
1
tolong tambahkan komentar Anda di dalam jawaban Anda
Supun Wijerathne
0

Jika kami tidak menyediakan lingkup apa pun maka ruang lingkup standar dikompilasi, Jika Anda ingin mengonfirmasi, cukup buka tab pom Efektif di editor gerhana, itu akan menampilkan Anda sebagai kompilasi.

Umanath
sumber
OP bertanya apa ruang lingkup yang dan tidak , tidak menemukan apa lingkup default adalah.
Wouter