Manajemen Ketergantungan di Gradle

1. Ikhtisar

Dalam tutorial ini, kita akan melihat mendeklarasikan dependensi dalam skrip build Gradle. Untuk contoh kami, kami akan menggunakan Gradle 6.7.

2. Struktur Khas

Mari kita mulai dengan skrip Gradle sederhana untuk proyek Java:

plugins { id 'java' } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter:2.3.4.RELEASE' testImplementation 'org.springframework.boot:spring-boot-starter-test:2.3.4.RELEASE' }

Seperti yang dapat dilihat di atas, kami memiliki tiga blok kode: plugin , repositori, dan dependensi .

Pertama, blok plugin memberi tahu kita bahwa ini adalah proyek Java. Kedua, blok dependensi mendeklarasikan versi 2.3.4. RELEASE dependensi spring-boot-starter yang diperlukan untuk mengompilasi kode sumber produksi project. Selain itu, ia juga menyatakan bahwa rangkaian pengujian proyek memerlukan pengujian spring-boot-starter-test untuk dikompilasi.

Build Gradle menarik semua dependensi ke bawah dari repositori Maven Central, seperti yang ditentukan oleh blok repositories .

Mari fokus pada bagaimana kita bisa mendefinisikan dependensi.

3. Konfigurasi Ketergantungan

Ada konfigurasi berbeda di mana kita dapat mendeklarasikan dependensi. Dalam hal ini, kita dapat memilih untuk lebih atau kurang tepat, seperti yang akan kita lihat nanti.

3.1. Bagaimana Menyatakan Ketergantungan

Untuk memulai, konfigurasi memiliki 4 bagian:

  • grup - pengidentifikasi organisasi, perusahaan, atau proyek
  • nama - pengenal ketergantungan
  • versi - yang ingin kami impor
  • classifier - berguna untuk membedakan dependensi dengan grup , nama , dan versi yang sama

Kita dapat mendeklarasikan dependensi dalam dua format. Format terkontrak memungkinkan kita untuk mendeklarasikan dependensi sebagai String :

implementation 'org.springframework.boot:spring-boot-starter:2.3.4.RELEASE'

Sebaliknya, format yang diperluas memungkinkan kita untuk menulisnya sebagai Peta :

implementation group:'org.springframework.boot', name: 'spring-boot-starter', version: '2.3.4.RELEASE'

3.2. Jenis Konfigurasi

Selain itu, Gradle menyediakan banyak jenis konfigurasi dependensi:

  • api - digunakan untuk membuat dependensi menjadi eksplisit dan mengeksposnya di classpath. Misalnya, saat menerapkan perpustakaan agar transparan kepada perpustakaan konsumen
  • implementasi - diperlukan untuk mengkompilasi kode sumber produksi dan murni internal. Mereka tidak diekspos di luar paket
  • compileOnly - digunakan ketika mereka perlu dideklarasikan hanya pada waktu kompilasi, seperti anotasi hanya-sumber atau pemroses anotasi. Mereka tidak muncul di jalur kelas waktu proses atau jalur kelas pengujian
  • compileOnlyApi - digunakan saat diperlukan pada waktu kompilasi dan saat harus terlihat di classpath untuk konsumen
  • runtimeOnly - digunakan untuk mendeklarasikan dependensi yang diperlukan hanya pada waktu proses dan tidak tersedia pada waktu kompilasi
  • testImplementation - diperlukan untuk menyusun pengujian
  • testCompileOnly - hanya diperlukan pada waktu kompilasi pengujian
  • testRuntimeOnly - hanya diperlukan pada waktu proses pengujian

Perlu diperhatikan bahwa Gradle versi terbaru menghentikan beberapa konfigurasi seperti compile , testCompile , runtime, dan testRuntime. Pada saat penulisan, mereka masih tersedia.

4. Jenis Ketergantungan Eksternal

Mari pelajari jenis-jenis dependensi eksternal yang kita temui dalam skrip build Gradle.

4.1. Ketergantungan Modul

Pada dasarnya, cara paling umum untuk mendeklarasikan dependensi adalah dengan mereferensikan repositori. Repositori Gradle adalah kumpulan modul yang diatur menurut grup , nama , dan versi .

Faktanya, Gradle menarik dependensi dari repositori yang ditentukan di dalam blok repositori :

repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter:2.3.4.RELEASE' }

4.2. Ketergantungan File

Mengingat bahwa proyek tidak selalu menggunakan manajemen ketergantungan otomatis, beberapa proyek mengatur ketergantungan sebagai bagian dari kode sumber atau sistem file lokal. Jadi, kita perlu menentukan lokasi yang tepat di mana dependensi berada.

Untuk tujuan ini, kita dapat menggunakan file untuk menyertakan koleksi dependensi:

dependencies { runtimeOnly files('libs/lib1.jar', 'libs/lib2.jar') }

Demikian pula, kita dapat menggunakan filetree untuk memasukkan hierarki file jar ke dalam direktori:

dependencies { runtimeOnly fileTree('libs') { include '*.jar' } }

4.3. Dependensi Proyek

Karena satu project dapat bergantung pada project lain untuk menggunakan kembali kode, Gradle menawarkan kami kesempatan untuk melakukannya.

Katakanlah kita ingin menyatakan bahwa proyek kita bergantung pada proyek bersama :

 dependencies { implementation project ( ':shared' ) } 

4.4. Dependensi Gradle

Dalam kasus tertentu, seperti mengembangkan tugas atau plugin, kita bisa mendefinisikan dependensi yang termasuk dalam versi Gradle yang kita gunakan:

dependencies { implementation gradleApi() }

5. buildScript

As we saw before, we can declare the external dependencies of our source code and tests inside the dependencies block. Similarly, the buildScript block allows us to declare the Gradle build's dependencies, such as third-party plugins and task classes. Particularly, without a buildScript block, we can use only Gradle out-of-the-box features.

Below we declare that we want to use the Spring Boot plugin by downloading it from Maven Central:

buildscript { repositories { mavenCentral() } dependencies { classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.3.4.RELEASE' } } apply plugin: 'org.springframework.boot'

Hence we need to specify the source from which we'll download external dependencies because there isn't a default one.

What's described above is related to older versions of Gradle. Instead, in newer versions, it's possible to use a more concise form:

plugins { id 'org.springframework.boot' version '2.3.4.RELEASE' }

6. Conclusion

Dalam artikel ini, kita membahas dependensi Gradle, cara mendeklarasikannya, dan jenis konfigurasi yang berbeda.

Dengan poin-poin ini, kode sumber untuk artikel ini tersedia di GitHub.