Cakupan Ketergantungan Maven

1. Perkenalan

Maven adalah salah satu alat build paling populer di ekosistem Java, dan salah satu fitur intinya adalah manajemen dependensi.

Pada artikel ini, kami akan menjelaskan dan mengeksplorasi mekanisme yang membantu dalam mengelola dependensi transitif dalam proyek Maven - cakupan dependensi.

2. Ketergantungan Transitif

Sederhananya, ada dua jenis dependensi di Maven langsung dan transitif.

Dependensi langsung adalah salah satu yang secara eksplisit disertakan dalam proyek. Ini dapat dimasukkan dalam proyek menggunakan tag:

 junit junit 4.12 

Dependensi transitif, di sisi lain, adalah dependensi yang dibutuhkan oleh dependensi langsung kita. Dependensi transitif yang diperlukan secara otomatis disertakan dalam proyek kami oleh Maven.

Kita dapat membuat daftar semua dependensi termasuk dependensi transitif dalam proyek menggunakan perintah : mvn dependency: tree .

3. Lingkup Ketergantungan

Cakupan dependensi dapat membantu membatasi transitivitas dependensi dan memodifikasi classpath untuk berbagai tugas yang dibangun. Maven memiliki 6 cakupan dependensi default .

Dan penting untuk dipahami bahwa setiap cakupan - kecuali impor - memang berdampak pada dependensi transitif.

3.1. Menyusun

Ini adalah cakupan default jika tidak ada cakupan lain yang disediakan.

Dependensi dengan cakupan ini tersedia di classpath project dalam semua tugas build dan disebarkan ke project dependen.

Lebih penting lagi, dependensi ini juga bersifat transitif:

 commons-lang commons-lang 2.6 

3.2. Disediakan

Cakupan ini digunakan untuk menandai dependensi yang harus disediakan saat runtime oleh JDK atau container , karena itulah namanya.

Kasus penggunaan yang baik untuk cakupan ini adalah aplikasi web yang diterapkan di beberapa penampung, di mana penampung sudah menyediakan beberapa pustaka itu sendiri.

Misalnya, server web yang sudah menyediakan API Servlet saat runtime, sehingga dalam proyek kami, dependensi tersebut dapat ditentukan dengan cakupan yang disediakan :

 javax.servlet servlet-api 2.5 provided 

The disediakan dependensi hanya tersedia pada saat kompilasi dan di classpath tes proyek; terlebih lagi, mereka tidak transitif.

3.3. Runtime

Dependensi dengan cakupan ini diperlukan pada waktu proses , tetapi tidak diperlukan untuk kompilasi kode proyek. Oleh karena itu, dependensi yang ditandai dengan runtime scope akan ada di runtime dan test classpath, tetapi akan hilang dari classpath kompilasi.

Contoh bagus dari dependensi yang harus menggunakan runtime scope adalah driver JDBC:

 mysql mysql-connector-java 6.0.6 runtime 

3.4. Uji

Cakupan ini digunakan untuk menunjukkan bahwa ketergantungan tidak diperlukan pada waktu proses standar aplikasi, tetapi hanya digunakan untuk tujuan pengujian. Dependensi pengujian tidak bersifat transitif dan hanya ada untuk classpath pengujian dan eksekusi.

Kasus penggunaan standar untuk cakupan ini adalah menambahkan pustaka pengujian seperti JUnit ke aplikasi kita:

 junit junit 4.12 test 

3.5. Sistem

Cakupan sistem sangat mirip dengan cakupan yang disediakan . Perbedaan utama antara kedua cakupan tersebut adalah bahwa sistem mengharuskan kita untuk menunjuk langsung ke tabung tertentu di sistem.

Hal penting untuk diingat adalah bahwa membangun proyek dengan dependensi cakupan sistem dapat gagal pada mesin yang berbeda jika dependensi tidak ada atau terletak di tempat yang berbeda dari yang ditunjukkan oleh systemPath :

 com.baeldung custom-dependency 1.3.2 system ${project.basedir}/libs/custom-dependency-1.3.2.jar 

3.6. Impor

Cakupan ini ditambahkan di Maven 2.0.9 dan hanya tersedia untuk pom tipe dependensi . Kami akan berbicara lebih banyak tentang jenis ketergantungan di artikel mendatang.

Impor menunjukkan bahwa ketergantungan ini harus diganti dengan semua dependensi efektif yang dideklarasikan dalam POM-nya:

 com.baeldung custom-project 1.3.2 pom import 

4. Cakupan dan Transitivitas

Setiap cakupan dependensi memengaruhi dependensi transitif dengan caranya sendiri. Artinya, dependensi transitif yang berbeda dapat berakhir di project dengan cakupan yang berbeda.

Namun, dependensi dengan cakupan yang disediakan dan pengujian tidak akan pernah disertakan dalam project utama.

Kemudian:

  • Untuk kompilasi lingkup, semua dependensi dengan lingkup runtime akan ditarik dengan runtime lingkup, dalam proyek dan semua dependensi dengan kompilasi lingkup akan ditarik dengan kompilasi lingkup, dalam proyek
  • Untuk cakupan yang disediakan , runtime dan dependensi cakupan kompilasi akan ditarik dengan cakupan yang disediakan , dalam project
  • Untuk cakupan pengujian , dependensi transitif runtime dan cakupan kompilasi akan ditarik dengan cakupan pengujian , dalam project
  • Untuk runtime lingkup, baik runtime dan kompilasi lingkup transitif dependensi akan ditarik dengan runtime lingkup, dalam proyek

5. Kesimpulan

Dalam tutorial singkat ini, kami berfokus pada cakupan dependensi Maven, tujuannya, dan detail cara operasinya.

Jika Anda ingin menggali Maven lebih dalam, dokumentasi adalah tempat yang tepat untuk memulai.