Gradle: Sınıf yolu ile derleme bağımlılıkları arasındaki fark nedir?


92

Projeme bağımlılıklar eklerken, onlara hangi ön eki vermem gerektiğinden asla emin değilim, örneğin "classpath"veya"compile".

Örneğin, aşağıdaki bağımlılıklarım derleme zamanı mı yoksa sınıf yolu mu olmalı?

Ayrıca, bu benim uygulamalarımın build.gradle içinde mi yoksa modüle özgü build.gradle içinde mi olmalı?

Mevcut build.gradle (uygulama düzeyinde):

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.hibernate:hibernate-core:5.0.5.Final'
    compile 'mysql:mysql-connector-java:5.1.38'
} 

1
Anladığımdan emin değilim. classpathgeçerli bir bağımlılık kapsamı değil.
Tunaki

Belki kafam karışıyor, geçerli bağımlılık kapsamları nelerdir?
java123999

Şu belgeye bir göz atın: docs.gradle.org/current/userguide/…
Tunaki

Fark ettiğim bir şey , burada belirtildiği gibi , compileOnlybağımlılıkların gittiği project.configurations.compileClasspathama gitmediği. Github.com/iboyko/gradle-plugins/issues/5project.configurations.compile
Vytenis Bivainis

Yanıtlar:


47

Sanırım referans veriyorsun compileve bloğun classpathiçinde dependencies {}. Eğer öyleyse, bunlar bağımlılık Yapılandırmalarıdır .

Yapılandırma, basitçe adlandırılmış bir bağımlılıklar kümesidir.

compileYapılandırma Java eklentisi tarafından oluşturulur. classpathYapılandırma sık görülür buildSrc {}bir bağımlılıkları ilan etmek gerekiyor blokta build.gradle, kendisi için (eklentileri için, belki).


Teşekkürler, bu yüzden ana build.gradle'ım için sınıf yolunu kullanmam gerekmiyor mu?
java123999

@ java123999 Hayır, özel olarak yazılmış eklentiler kullanmıyorsanız
Eric Wendelin

@EricWendelin "Bağımlılıklar içinde {} engelle" dediğiniz yerde "buildscript {bağımlılıklar {}} bloğu içinde" mi demek istiyorsunuz? (Emin değilim, sadece soruyorum.)
Paulo Merson

2
Bir dependencies {}blok hem içinde hem de buildscript {}dışında ilan edilebilir . classpathİçindeyken, yapılandırma betiğinin kendisini derlemek için gereken bağımlılıklar için yapılandırmayı kullanırsınız .
Eric Wendelin

55

Eğer buildscript'in kendisi çalışacak bir şeye ihtiyaç duyuyorsa , sınıf yolunu kullanın .

Projenizin çalışması için bir şeye ihtiyacınız varsa, derlemeyi kullanın .

buildscript{}Blok build.gradle kendisi içindir.

Çoklu proje oluşturma için, en üst düzey yapı dosyası kök proje içindir, özel yapı dosyası alt proje (modül) içindir.

Tüm alt projeler / modüller için ortak olan yapılandırma seçeneklerini ekleyebileceğiniz en üst düzey yapı dosyası.

Uygulama bağımlılıklarınızı üst düzey derleme dosyasına yerleştirmeyin, bunlar ayrı modül build.gradle dosyalarına aittir.


Doğrulamak için: bu, proandroiddev.com/… ' nin a compiledeğil a kullanması gerektiği anlamına classpathmı geliyor?
WillC

1
Ancak, projede tipik android uygulamaları gibi yalnızca bir modül varsa neden uygulama bağımlılıklarını en üst düzey dosyaya yerleştirmeyesiniz?
Harsha

18

Doğru anlarsam, Project.dependencieskomut dosyası bloğunu komut dosyası bloğuyla karıştırıyorsunuz Project.buildscript.dependencies(tıpkı bu soruya ulaştığımda yaptığım gibi).

Buna bulduğum şeyle cevap vermeye çalışacağım.

Bence Project.dependencieskomut dosyası bloğuna zaten aşina olmanız gerekir . Bu blokta, kaynak kodumuzun gerektirdiği bağımlılıkları bildiriyoruz. Proje için ihtiyaç duyduğumuz bir bağımlılığı beyan etmenin birkaç yolu vardır. Gradle Tutorial: Dependency Types bölümüne bakınız . Sadece bu problemle en alakalı kısımdan bahsedeceğim:

compile 'org.hibernate:hibernate-core:5.0.5.Final'bir modül bağımlılık bildirimidir. Derleme yapılandırması (şimdi uygulama yapılandırması tarafından kaldırılmıştır) için yalnızca bir anahtar sözcüktür Implementation only dependencies.Bu, hangi bağımlılık türünü açıklayan bir anahtar sözcük değildir (burada türe göre öğreticide tanımlanan üç türü izliyorum, yani modül, dosya ve proje.)

In Gradle Öğreticisi: Yapı Mantık Organize diyor:

Derleme komut dosyanızın harici kitaplıklar kullanması gerekiyorsa, bunları derleme komut dosyasının kendisindeki komut dosyasının sınıf yoluna ekleyebilirsiniz. Bunu buildscript () yöntemini kullanarak yaparsınız, derleme betiği sınıf yolunu bildiren bir kapanışa geçersiniz.

Bu, örneğin Java derleme sınıf yolunu bildirdiğiniz yolla aynıdır. Proje bağımlılıkları dışında, Bağımlılık Türleri'nde açıklanan bağımlılık türlerinden herhangi birini kullanabilirsiniz.

Derleme betiği sınıfyolunu bildirdikten sonra, sınıf yolundaki diğer sınıflarda olduğu gibi, oluşturma betiğinizdeki sınıfları kullanabilirsiniz.

Umarım işler şimdi senin için netleşiyordur.

İle , projenizdeki kaynak yerine derleme betiğinin kendisi tarafından kullanılan bir modül bağımlılığı olan yöntemi classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"ayarlıyoruz .classpathcom.android.tools.build:gradle:${Versions.android_gradle_plugin}

Öte yandan, compile 'org.hibernate:hibernate-core:5.0.5.Final'projeniz için gerekli olan bir modül bağımlılığını derleme yapılandırmasıyla bildiriyoruz .

tl; dr: classpath, compileve implementationfarklı koşullarda bağımlılıkları karşı kullanılabilecek tüm anahtar kelimelerdir. İlki, derleme betiğine bir bağımlılık geçirmek istediğinizde kullanılır ve ikincisi, bildirmek isteyebileceğiniz yapılandırmalardan biridir .


1
İyi cevap. Eklemek zorundayım ki, sadece anahtar kelimelerin kendilerine yukarıda güzel bir şekilde açıklandığı gibi bakmakla kalmamalıyız, ayrıca istenen yapıyı da dikkate almalıyız çünkü anahtar kelimeler tek başına tüm içeriği tanımlamaz. Örneğin , yalnızca derleme sırasında gerekli olan ancak çalışma zamanında ihtiyaç duyulmayan bir jar olduğu için ilişkilendirme 'org.projectlombok:lombok:1.18.4'yoktur . Bu nedenle, doğru kullanım, tanımlanan anahtar sözcükler ve yapının karşılıklı etkileşimidir. Bu, kişinin önceden bilgiye ihtiyacı olduğu anlamına gelir. classpathjavacjava
eigenfield
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.