Maven - Kelola Dependensi

Salah satu fitur inti Maven adalah Manajemen Ketergantungan. Mengelola ketergantungan adalah tugas yang sulit setelah kita berurusan dengan proyek multi-modul (terdiri dari ratusan modul / sub-proyek). Maven memberikan kontrol tingkat tinggi untuk mengelola skenario semacam itu.

Penemuan Ketergantungan Transitif

Hal ini cukup sering terjadi, ketika sebuah perpustakaan, katakanlah A, bergantung pada perpustakaan lain, katakanlah B. Dalam kasus proyek C lain ingin menggunakan A, maka proyek itu perlu menggunakan perpustakaan B juga.

Maven membantu menghindari persyaratan tersebut untuk menemukan semua perpustakaan yang diperlukan. Maven melakukannya dengan membaca file proyek (pom.xml) dependensi, mencari tahu dependensinya, dan seterusnya.

Kita hanya perlu mendefinisikan ketergantungan langsung di setiap proyek pom. Maven menangani sisanya secara otomatis.

Dengan ketergantungan transitif, grafik pustaka yang disertakan dapat dengan cepat berkembang ke tingkat yang lebih luas. Kasus bisa muncul ketika ada perpustakaan duplikat. Maven menyediakan beberapa fitur untuk mengontrol tingkat ketergantungan transitif.

Sr.No. Fitur & Deskripsi
1

Dependency mediation

Menentukan versi dependensi yang akan digunakan ketika beberapa versi artefak ditemukan. Jika dua versi dependensi berada pada kedalaman yang sama dalam pohon dependensi, dependensi yang dideklarasikan pertama akan digunakan.

2

Dependency management

Tentukan secara langsung versi artefak yang akan digunakan saat ditemukan dalam dependensi transitif. Sebagai contoh, project C dapat menyertakan B sebagai dependensi di bagian Manajemen dependensinya dan secara langsung mengontrol versi B mana yang akan digunakan ketika pernah direferensikan.

3

Dependency scope

Menyertakan dependensi sesuai dengan tahap build saat ini.

4

Excluded dependencies

Semua ketergantungan transitif dapat dikecualikan menggunakan elemen "pengecualian". Misalnya, A bergantung pada B dan B bergantung pada C, lalu A dapat menandai C sebagai dikecualikan.

5

Optional dependencies

Semua ketergantungan transitif dapat ditandai sebagai opsional menggunakan elemen "opsional". Sebagai contoh, A bergantung pada B dan B bergantung pada C. Sekarang B menandai C sebagai opsional. Maka A tidak akan menggunakan C.

Lingkup Ketergantungan

Penemuan Ketergantungan Transitif dapat dibatasi menggunakan berbagai Lingkup Ketergantungan seperti yang disebutkan di bawah ini.

Sr.No. Ruang Lingkup & Deskripsi
1

compile

Cakupan ini menunjukkan bahwa ketergantungan tersedia di classpath proyek. Ini adalah cakupan default.

2

provided

Cakupan ini menunjukkan bahwa ketergantungan akan disediakan oleh JDK atau web-Server / Container pada waktu proses.

3

runtime

Cakupan ini menunjukkan bahwa ketergantungan tidak diperlukan untuk kompilasi, tetapi diperlukan selama eksekusi.

4

test

Cakupan ini menunjukkan bahwa dependensi hanya tersedia untuk fase kompilasi dan eksekusi pengujian.

5

system

Cakupan ini menunjukkan bahwa Anda harus menyediakan jalur sistem.

6

import

Cakupan ini hanya digunakan jika dependensi berjenis pom. Cakupan ini menunjukkan bahwa POM yang ditentukan harus diganti dengan dependensi di bagian <dependencyManagement> POM tersebut.

Manajemen Ketergantungan

Biasanya, kami memiliki sekumpulan proyek di bawah proyek bersama. Dalam kasus seperti itu, kita dapat membuat pom umum yang memiliki semua dependensi yang sama dan kemudian menjadikan pom ini, induk dari pom subproyek. Contoh berikut akan membantu Anda memahami konsep ini.

Berikut detail grafik dependensi di atas -

  • App-UI-WAR bergantung pada App-Core-lib dan App-Data-lib.
  • Root adalah induk dari App-Core-lib dan App-Data-lib.
  • Root mendefinisikan Lib1, lib2, Lib3 sebagai dependensi di bagian dependensinya.

App-UI-WAR

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>App-UI-WAR</artifactId>
   <version>1.0</version>
   <packaging>war</packaging>
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname</groupId>
         <artifactId>App-Core-lib</artifactId>
         <version>1.0</version>
      </dependency>
   </dependencies>  
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname</groupId>
         <artifactId>App-Data-lib</artifactId>
         <version>1.0</version>
      </dependency>
   </dependencies>  
</project>

App-Core-lib

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
      <artifactId>Root</artifactId>
      <groupId>com.companyname.groupname</groupId>
      <version>1.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>App-Core-lib</artifactId>
   <version>1.0</version> 
   <packaging>jar</packaging>
</project>

App-Data-lib

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
      <artifactId>Root</artifactId>
      <groupId>com.companyname.groupname</groupId>
      <version>1.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>App-Data-lib</artifactId>
   <version>1.0</version>   
   <packaging>jar</packaging>
</project>

Root

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>Root</artifactId>
   <version>1.0</version>
   <packaging>pom</packaging>
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname1</groupId>
         <artifactId>Lib1</artifactId>
         <version>1.0</version>
      </dependency>
   </dependencies>  
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname2</groupId>
         <artifactId>Lib2</artifactId>
         <version>2.1</version>
      </dependency>
   </dependencies>  
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname3</groupId>
         <artifactId>Lib3</artifactId>
         <version>1.1</version>
      </dependency>
   </dependencies>  
</project>

Sekarang ketika kita membangun proyek App-UI-WAR, Maven akan menemukan semua dependensi dengan melintasi grafik dependensi dan membangun aplikasi.

Dari contoh di atas, kita dapat mempelajari konsep utama berikut -

  • Dependensi umum dapat ditempatkan di satu tempat menggunakan konsep pom induk. DependensiApp-Data-lib dan App-Core-libproyek terdaftar dalam proyek Root (Lihat jenis kemasan Root. Ini adalah POM).

  • Tidak perlu menentukan Lib1, lib2, Lib3 sebagai dependensi di App-UI-WAR. Maven menggunakanTransitive Dependency Mechanism untuk mengatur detail seperti itu.