Saat menambahkan dependensi ke proyek saya, saya tidak pernah yakin awalan apa yang harus saya berikan kepada mereka, misalnya "classpath"
atau"compile".
Misalnya, haruskah dependensi saya di bawah ini berupa waktu kompilasi atau classpath?
Juga, haruskah ini ada di aplikasi saya build.gradle atau di modul build.gradle khusus?
Build.gradle saat ini (di level aplikasi):
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile 'org.hibernate:hibernate-core:5.0.5.Final'
compile 'mysql:mysql-connector-java:5.1.38'
}
java
gradle
dependencies
java123999
sumber
sumber
classpath
bukan cakupan ketergantungan yang valid.compileOnly
dependensi mengarah keproject.configurations.compileClasspath
tetapi tidak keproject.configurations.compile
, seperti yang disebutkan di sini github.com/iboyko/gradle-plugins/issues/5Jawaban:
Saya akan menebak bahwa Anda mereferensikan
compile
danclasspath
di dalamdependencies {}
blok. Jika demikian, itu adalah Konfigurasi ketergantungan .The
compile
konfigurasi dibuat oleh plugin Java. Theclasspath
konfigurasi sering terlihat dibuildSrc {}
blok mana salah satu kebutuhan untuk menyatakan dependensi untuk build.gradle, itu sendiri (untuk plugin, mungkin).sumber
dependencies {}
blok dapat dideklarasikan baik di dalam maupun dibuildscript {}
luarnya. Saat berada di dalam, Anda menggunakanclasspath
konfigurasi untuk dependensi yang diperlukan untuk mengompilasi skrip build itu sendiri.Jika buildscript itu sendiri membutuhkan sesuatu untuk dijalankan, gunakan classpath .
Jika proyek Anda membutuhkan sesuatu untuk dijalankan, gunakan kompilasi .
The
buildscript{}
blok untuk build.gradle itu sendiri.Untuk pembangunan multi-proyek, file build tingkat atas adalah untuk proyek root, file build spesifik untuk sub-proyek (modul).
File build level atas tempat Anda dapat menambahkan opsi konfigurasi yang umum untuk semua subproyek / modul.
Jangan tempatkan dependensi aplikasi Anda dalam file build level atas, dependensi tersebut termasuk dalam file build.gradle modul individual
sumber
compile
dan bukanclasspath
?Jika saya mengerti dengan benar, Anda mengacaukan
Project.dependencies
blok skrip denganProject.buildscript.dependencies
blok skrip (seperti yang saya lakukan ketika saya mencapai pertanyaan ini).Saya akan mencoba menjawab ini dengan apa yang saya temukan.
Saya pikir Anda seharusnya sudah terbiasa dengan
Project.dependencies
blok skrip. Di blok ini, kami mendeklarasikan dependensi yang diperlukan oleh kode sumber kami. Ada beberapa cara untuk mendeklarasikan ketergantungan yang kita perlukan untuk proyek tersebut. Lihat Tutorial Gradle: Jenis Ketergantungan . Saya hanya akan menyebutkan bagian yang paling relevan dengan masalah ini:compile 'org.hibernate:hibernate-core:5.0.5.Final'
adalah deklarasi ketergantungan modul. Konfigurasi kompilasi (yang sekarang sudah tidak digunakan lagi oleh konfigurasi implementasi.) Hanyalah sebuah kata kunci untukImplementation only dependencies.
Ini bukan kata kunci yang menjelaskan jenis ketergantungannya (menurut jenis di sini saya mengikuti tiga jenis yang ditentukan dalam tutorial, yaitu modul, file, dan proyek.)Dalam Gradle Tutorial: Organizing Build Logic dikatakan:
Saya harap semuanya menjadi jelas bagi Anda sekarang.
Dengan
classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"
kami menyetelclasspath
metodecom.android.tools.build:gradle:${Versions.android_gradle_plugin}
yang merupakan dependensi modul yang digunakan oleh skrip build itu sendiri, bukan sumber dalam proyek Anda.Di sisi lain, dengan
compile 'org.hibernate:hibernate-core:5.0.5.Final'
kami mendeklarasikan ketergantungan modul yang diperlukan untuk proyek Anda dengan konfigurasi kompilasi .tl; dr: The
classpath
,,compile
danimplementation
adalah semua kata kunci yang dapat digunakan melawan dependensi dalam keadaan yang berbeda. Yang pertama digunakan saat Anda ingin meneruskan dependensi ke skrip build, dan yang terakhir adalah salah satu konfigurasi yang mungkin ingin Anda deklarasikan.sumber
'org.projectlombok:lombok:1.18.4'
tidak memilikiclasspath
pengaitan karena ini adalah jar yang hanya diperlukan selamajavac
waktu kompilasi tetapi tidak diperlukan pada waktu prosesjava
. Oleh karena itu, penggunaan yang benar merupakan interaksi antara kata kunci dan artefak yang ditentukan. Artinya, seseorang membutuhkan pengetahuan apriori.