13 Aralık 2021 Pazartesi

Project Arayüzü dependencies Property

Giriş
Gradle ile herhangi bir plugin kullanmazsak toplam 4 tane dependency tipi geliyor. Şeklen şöyle
3.8'ten sonra Olan Değişiklikler
compile, runtime, testCompile, testRuntime kullanılmamalı. Açıklaması şöyle
The usage of the compile and runtime configurations in the Java ecosystem plugins has been discouraged since Gradle 3.4.
...
Other sources sets create similar configurations (e.g. testCompile and testRuntime for the test source set), should not be used either. 
provided kullanılmamalı, yerine compileOnly geldi. Açıklaması şöyle
compileOnly is the replacement — the equivalent configuration that is being deprecated is provided
providedCompile ve providedRuntime
  
1. api
Açıklaması şöyle. Maven'daki compile scope gibi
api (same as compile it also leaks(exposes) dependencies to the consumer’s compile-classpath)
api için yeni bir plugin eklemek gerekiyor. Şöyle yaparız
plugins {
  id 'java-library'
}
2. compileOnly - Örneğin Lombok, javaee-api İçin
Açıklaması şöyle. Derlemeye dahil edilir ancak çıktıya dahil edilmez. Sanırım Maven' deki provided anlamına geliyor.
Dependencies whose API is required at compile time but whose implementation is to be provided by a consuming library, application or runtime environment.
3. runtimeOnly
Derlemeye dahil edilmez ancak çıktıya dahil edilir. Örneğin SLF4J gerçekleştirimini runtimeOnly ile değiştirebiliriz. Veya JDBC gerçekleştirimi olan mysql ya da postgresql sürücüsünü runtimeOnly ile değiştirebiliriz

4. implementation - Gradle 7 İle compile Yerine Geldi
Artık "compile" kullanılmıyor. Açıklaması şöyle. Derlemeye dahil edilir, çıktıya dahil edilir ancak consumer göremez. Maven'daki runtime scope gibi
compile(Deprecated)
Compile time dependencies. Superseded by implementation.
5. testCompileOnly
Örneğin testlerde lombok kullanmak içindir

6. testImplementation
Artık "testCompile" kullanılmıyor. Şöyle yaparız. junit-jupiter-api arayüzünü gerçekleştiren engine testRuntimeOnly  olarak dahil edilir. 
dependencies {
  testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
  testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
7. developmentOnly
Örnek
Şöyle yaparız
dependencies {
  ...
  developmentOnly 'org.springframework.boot:spring-boot-devtools'
}
Maven karşılığı şöyle
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <optional>true</optional>
</dependency>
  
Neden compile kaldırıldı
Açıklaması şöyle
Earlier we had a configuration called compile(Deprecated) which leak dependencies to the consumer’s compile-classpath which can cause dependency pollution (means unnecessary recompile and accidental use of transitive dependency).
Elimizde iki tane kütüphane olsun A ve B. A kütüphanesi B'yi implementation olarak kullansın. Consumer artık B'yi göremez. Ancak A kütüphanesi B'yi api olarak kullansaydı Consumer B'yi görebilirdi
Örnek
Şöyle yaparız
dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web:2.2.5.RELEASE'
}
dependency Tree
Örnek
Şöyle yaparız
gradlew dependencies --configuration=testRuntimeClasspath | find "log4j"
Çıktı olarak şunu alırız
------------------------------------------------------------
Root project
------------------------------------------------------------

testRuntimeClasspath - Runtime classpath of source set 'test'.
+--- org.apache.logging.log4j:log4j-api -> 2.17.1
+--- org.apache.logging.log4j:log4j-core -> 2.17.1
|    \--- org.apache.logging.log4j:log4j-api:2.17.1
+--- com.github.stefanbirkner:system-rules -> 1.17.0
|    \--- junit:junit-dep:[4.9,) -> 4.11
|         \--- junit:junit:4.11 -> 4.13.2
|              \--- org.hamcrest:hamcrest-core:1.3
+--- org.junit.jupiter:junit-jupiter-api -> 5.8.1
|    +--- org.junit:junit-bom:5.8.1
|    |    +--- org.junit.jupiter:junit-jupiter-api:5.8.1 (c)
|    |    +--- org.junit.jupiter:junit-jupiter-engine:5.8.1 (c)
|    |    +--- org.junit.platform:junit-platform-commons:1.8.1 (c)
|    |    +--- org.junit.platform:junit-platform-engine:1.8.1 (c)
|    |    \--- org.junit.vintage:junit-vintage-engine:5.8.1 (c)
|    +--- org.opentest4j:opentest4j:1.2.0
|    \--- org.junit.platform:junit-platform-commons:1.8.1
|         \--- org.junit:junit-bom:5.8.1 (*)
+--- org.junit.jupiter:junit-jupiter-engine -> 5.8.1
|    +--- org.junit:junit-bom:5.8.1 (*)
|    +--- org.junit.platform:junit-platform-engine:1.8.1
|    |    +--- org.junit:junit-bom:5.8.1 (*)
|    |    +--- org.opentest4j:opentest4j:1.2.0
|    |    \--- org.junit.platform:junit-platform-commons:1.8.1 (*)
|    \--- org.junit.jupiter:junit-jupiter-api:5.8.1 (*)
\--- org.junit.vintage:junit-vintage-engine -> 5.8.1
     +--- org.junit:junit-bom:5.8.1 (*)
     +--- org.junit.platform:junit-platform-engine:1.8.1 (*)
     \--- junit:junit:4.13.2 (*)
Örnek
Şöyle yaparız
gradle mymodule:dependencies














Hiç yorum yok:

Yorum Gönder

Gradle Daemon Nedir?

Giriş Açıklaması  şöyle . Gradle Daemon arka planda çalışır. Çünkü Gradle'ı ayağa kaldırmak ve ilklendirmek çok uzun sürüyor.  Gradle ru...