25 Aralık 2021 Cumartesi

assemble Task - Sadece Yapılandırır Testleri Çalıştırmaz

Giriş
Açıklaması şöyle. Base plugin ile geliyor
assemble - Assembles the outputs of this project.
Testleri çalıştırmadığı için
gradle build -x test
komutuna tercih edilebilir




24 Aralık 2021 Cuma

gradle.properties Dosyası

Giriş
Açıklaması şöyle
Gradle provides several options that make it easy to configure the Java process that will be used to execute your build. While it’s possible to configure these in your local environment via GRADLE_OPTS or JAVA_OPTS, it is useful to be able to store certain settings like JVM memory configuration and Java home location in version control so that an entire team can work with a consistent environment. To do so, place these settings into a gradle.properties file committed to your version control system.
JVM Parametreleri
Açıklaması şöyle
Specifies the JVM arguments used for the Gradle Daemon. The setting is particularly useful for configuring JVM memory settings for build performance. This does not affect the JVM settings for the Gradle client VM. The default is -Xmx512m "-XX:MaxMetaspaceSize=256m".
Örnek
"Check the JVM memory arguments defined for the gradle process"
diye bir hata alıyordum. gradle.properties dosyasına şu satırı ekledim
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=1024m 
  -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
JDK 17 için şöyle yaparız
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=1024m 
  -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

23 Aralık 2021 Perşembe

org.barfuin.gradle.taskinfo plugin

Giriş
Bu plugin'i ilk olarak burada gördüm

Kendim denediğimde sonuç şöyle çıktı
> Task :tiTree
:build                                               (org.gradle.api.DefaultTask)
+--- :assemble                                       (org.gradle.api.DefaultTask)
|    `--- :jar                                       (org.gradle.api.tasks.bundling.Jar)
|         +--- :classes                              (org.gradle.api.DefaultTask)
|         |    +--- :compileGroovy                   (org.gradle.api.tasks.compile.GroovyCompile)
|         |    |    `--- :compileJava                (org.gradle.api.tasks.compile.JavaCompile)
|         |    +--- :compileJava                     (org.gradle.api.tasks.compile.JavaCompile)
|         |    `--- :processResources                (org.gradle.language.jvm.tasks.ProcessResources)
|         `--- :writeManifestProperties              (nebula.plugin.info.reporting.InfoPropertiesFile)
`--- :check                                          (org.gradle.api.DefaultTask)
     +--- :downloadLicenses                          (nl.javadude.gradle.plugins.license.DownloadLicenses)
     +--- :license                                   (org.gradle.api.DefaultTask)
     |    +--- :licenseMain                          (com.hierynomus.gradle.license.tasks.LicenseCheck)
     |    `--- :licenseTest                          (com.hierynomus.gradle.license.tasks.LicenseCheck)
     `--- :test                                      (org.gradle.api.tasks.testing.Test)
          +--- :classes                              (org.gradle.api.DefaultTask)
          |    +--- :compileGroovy                   (org.gradle.api.tasks.compile.GroovyCompile)
          |    |    `--- :compileJava                (org.gradle.api.tasks.compile.JavaCompile)
          |    +--- :compileJava                     (org.gradle.api.tasks.compile.JavaCompile)
          |    `--- :processResources                (org.gradle.language.jvm.tasks.ProcessResources)
          +--- :testClasses                          (org.gradle.api.DefaultTask)
          |    +--- :compileTestGroovy               (org.gradle.api.tasks.compile.GroovyCompile)
          |    |    +--- :classes                    (org.gradle.api.DefaultTask)
          |    |    |    +--- :compileGroovy         (org.gradle.api.tasks.compile.GroovyCompile)
          |    |    |    |    `--- :compileJava      (org.gradle.api.tasks.compile.JavaCompile)
          |    |    |    +--- :compileJava           (org.gradle.api.tasks.compile.JavaCompile)
          |    |    |    `--- :processResources      (org.gradle.language.jvm.tasks.ProcessResources)
          |    |    `--- :compileTestJava            (org.gradle.api.tasks.compile.JavaCompile)
          |    |         `--- :classes               (org.gradle.api.DefaultTask)
          |    |              +--- :compileGroovy    (org.gradle.api.tasks.compile.GroovyCompile)
          |    |              |    `--- :compileJava (org.gradle.api.tasks.compile.JavaCompile)
          |    |              +--- :compileJava      (org.gradle.api.tasks.compile.JavaCompile)
          |    |              `--- :processResources (org.gradle.language.jvm.tasks.ProcessResources)
          |    +--- :compileTestJava                 (org.gradle.api.tasks.compile.JavaCompile)
          |    |    `--- :classes                    (org.gradle.api.DefaultTask)
          |    |         +--- :compileGroovy         (org.gradle.api.tasks.compile.GroovyCompile)
          |    |         |    `--- :compileJava      (org.gradle.api.tasks.compile.JavaCompile)
          |    |         +--- :compileJava           (org.gradle.api.tasks.compile.JavaCompile)
          |    |         `--- :processResources      (org.gradle.language.jvm.tasks.ProcessResources)
          |    `--- :processTestResources            (org.gradle.language.jvm.tasks.ProcessResources)
          `--- :buildDashboard (finalizer)           (org.gradle.api.reporting.GenerateBuildDashboard)

Project Arayüzü plugins Property

Giriş
Sanırım Gradle 2.1 ile geliyor. Yeni plugin kullanımı içindir. Açıklaması şöyle. Yani pluginler https://plugins.gradle.org/ adresinden indirilir. 
The plugins block is the newer method of applying plugins, and they must be available in the Gradle plugin repository
...
The new plugins method does not work in multi-project configurations (subprojects, allprojects), but will work on the build configuration for each child project.
Eski Kullanım
İskelet olarak şöyle yaparız
buildscript {
  repositories {
    // define repositories for build script dependencies
  }
  dependencies {
    // define build script dependencies (a.k.a. plugins)
  }
}

repositories {
  // define repositories for regular project dependencies
}

dependencies {
  // define regular project dependencies
}
Örnek
Eski kullanım şöyle. Burada açıktan https://plugins.gradle.org/m2/ adresine atıfta bulunuluyor
buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE"
  }
}

apply plugin: "org.springframework.boot"
Yani yeni kullanımda eğer kendi plugin'imiz varsa ve bu adreste yoksa çalışmaz Açıklaması şöyle.
Keep in mind, that applying a plugin using the plugins DSL (plugins {...}) does not work for your private plugins or company plugins which are not published to the official Gradle plugin repo.
Örnek
Eğer bir plugin tarafından kullanılan bir jar varsa onu da dahil etmek için şöyle yaparız. Yani yine plugin tanımı gibi
buildscript {

  dependencies {
    classpath group: '...', name: '...', version: '...'
    classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE"
    ...
  }
}
Yeni Kullanım
Söz dizimi şöyle
plugins {
    id «plugin id» version «plugin version» [apply «false»]
}



shadow plugin

Giriş
Örnek
Yeni kullanımda şöyle yaparız
plugins { id 'com.github.johnrengelman.shadow' version '7.1.1' id 'java' }
Eğer gradle 6 kullanıyorsak şöyle yaparız
plugins {
    id 'com.github.johnrengelman.shadow' version '6.1.0'
}
Örnek 
Eski kullanımda şöyle yaparız. Burada "classpath" olarak tanımlayıp "apply plugin" yapmak lazım
buildscript {
  repositories {
    gradlePluginPortal()
  }
  dependencies {
    classpath 'gradle.plugin.com.github.jengelman.gradle.plugins:shadow:7.1.1'
  }
}

apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'java'
Çalıştırmak için şöyle yaparız
gradle shadowJar --stacktrace --warning-mode all
Çıktı olarak şunu alırız. Yani varsayılan uber veya fat jar ismi "-all" şeklinde
foo-1.0.1-SHAPSHOT-all.jar
Örnek
Şöyle yaparız
apply plugin:"com.github.johnrengelman.shadow"

shadowJar {
    mergeServiceFiles()
}

$ ./gradlew shadowJar

$java -jar build/libs/math-function-0.1-all.jar
Custom Transformer
Eğer Transformer yazmak istersek şöyle yaparız
dependencies {
  compile gradleApi()
  compile localGroovy()
  compile "com.github.jengelman.gradle.plugins:shadow:6.0.0"
}
Kodu buildSrc isimli bir dizine koymak gerekir. Kod şöyledir. Burada bir dosyaya ilk defa rastlanınca false dönülüyor. İkinci kez rastlanınca true dönülüyor. true dönünce de diğer transformer'lara sormaya gerek yok. Bu transformer da modifyOutputStream() metodu boş olduğu için duplicate dosyaları uber jar'a dahil etmez.
import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer
import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext
import shadow.org.apache.tools.zip.ZipOutputStream
import org.gradle.api.file.FileTreeElement
import org.slf4j.LoggerFactory
import org.slf4j.Logger


class ExcludeDuplicates implements Transformer {
  Logger logger = LoggerFactory.getLogger(ExcludeDuplicates.class)
  Map<String, Boolean> map = new HashMap<>()

  boolean canTransformResource(FileTreeElement element) {
    def path = element.relativePath.pathString

    logger.debug('Relative Path from element ' + path)
    if (element.file != null) {
      logger.debug('Absolute from sources ' + element.file.absolutePath)
    } else {
      logger.debug('Element "file" must not be null!')
    }
    boolean visited = map.getOrDefault(path, false)
    if (!visited) {
      logger.debug('First time visited')
      map.put(path, true)
    }
    return visited
  }

  void transform(TransformerContext context) {}

  boolean hasTransformedResource() { true }

  void modifyOutputStream(ZipOutputStream jos, boolean preserveFileTimestamps) {}
}
Kullanmak için şöyle yaparız
shadowJar {
  classifier = null
  configurations = [project.configurations.shadow]
  transform(new ExcludeDuplicates())
}
project.configurations.shadow Alanı
Açıklaması şöyle
Holds runtime dependencies that are not merged

shadowJar Task
gradle Jar task'tan kalıtır

archiveFileName Alanı
Örnek ver

archiveBaseName alanı
Örnek
Şöyle yaparız. Burada çıktı ismi kontrol ediliyor
// Output to build/libs/shadow.jar
shadowJar {
   archiveBaseName.set('shadow')
   archiveClassifier.set('')
   archiveVersion.set('')
}
duplicatesStrategy Alanı
Örnek
Normalde şöyle yapabilmemiz gerekir. Ancak şu anda çalışmıyor
shadowJar {
    duplicatesStrategy = DuplicatesStrategy.FAIL
}
exclude Alanı
Örnek
Şöyle yaparız. Burada META-INF altındaki bazı şeyler jar'a dahil edilmiyor
shadowJar {
  baseName = project.name
  classifier = ''
  archiveVersion = ''
  exclude "META-INF/*.SF"
  exclude "META-INF/*.DSA"
  exclude "META-INF/*.RSA"
}


22 Aralık 2021 Çarşamba

spring dependency-management plugin - Kullanmayın

Giriş
Bu plugin şu şekilde kullanılabilir
1. Gradle 5 öncesi Spring Boot Plugin İle Kullanım
2. Gradle 5 sonrası bu plugin'e gerek yok
3. Tek Başına Kullanım

Gradle 5 Öncesi Spring Boot Plugin İle Kullanım
Açıklaması şöyle. Yani bu kullanımda otomatik olarak spring-boot'u da getirmiş oluyoruz
When you apply the io.spring.dependency-management plugin, Spring Boot’s plugin will automatically import the spring-boot-dependencies bom from the version of Spring Boot that you are using. This provides a similar dependency management experience to the one that’s enjoyed by Maven users. For example, it allows you to omit version numbers when declaring dependencies that are managed in the bom. To make use of this functionality, declare dependencies in the usual way but omit the version number:
Örnek
Şöyle yaparız. Burada bill of materials (BOM) kullanılıyor
plugins {
  id "org.springframework.boot" version "2.1.5.RELEASE"
  id 'io.spring.dependency-management' version '1.0.8.RELEASE'
}
Örnek
Şöyle yaparız
plugins {
  id "io.spring.dependency-management" version <<version>>
}

dependencyManagement {
  imports {
    // The plugin already brings spring-boot-dependencies BOM,
    // We can also add other BOMs like:
    mavenBom 'another:dependency-bom:2.0.0'
  }
}

dependencies {
  // Then, now we can simply declare the dependencies we need
  // without having to worry about their versions
  implementation 'org.apache.kafka:connect-api'
  implementation 'com.rabbitmq:amqp-client'
}

16 Aralık 2021 Perşembe

java plugin

sourceCompatibility Alanı
Örnek
Şöyle yaparız
plugins {
  id 'java'
}
group = 'com.mybot'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
toolChain Alanı
Gradle 6.7 ile geliyor. Açıklaması şöyle. Normalde gradle kendisini çalıştıran JDK ile derleme yapıyordu. toolChain ile belirtilen JDK ile derleme yapar. JDK kurulu değilse otomatik olarak indirebilir.
No more release or sourceCompatibility tweaks, no more wiki pages describing which JDK you should install for the build to work.
Açıklaması şöyle
- All Java compilation tasks will use Java 11 to build. That means code in the main and test source sets, but also Java code in any custom source set you add, will be built with the configured Java version.
- All tests tasks, including the default test task and any additional custom Test task, will use Java 11 to run the tests.
- The javadoc task will use Java 11 to build the documentation.
Gradle tarafından tespit edilen toolChain'leri görmek için şöyle yaparız. Gradle kendi indirdiklerini "C:\Users\user\.gradle\jdks" altında topluyor. Bunlar "Auto-provisioned by Gradle" olarak işaretli
gradle -q javaToolchains

 + Options
     | Auto-detection:     Enabled
     | Auto-download:      Enabled

 + Eclipse Adoptium JDK 17.0.2+8
     | Location:           C:\Users\user\.gradle\jdks\jdk-17.0.2+8
     | Language Version:   17
     | Vendor:             Eclipse Adoptium
     | Is JDK:             true
     | Detected by:        Auto-provisioned by Gradle

 + Oracle JDK 17.0.1+12-LTS-39
     | Location:           D:\Kurulumlar\JDK\jdk-17_windows-x64_bin\jdk-17.0.1
     | Language Version:   17
     | Vendor:             Oracle
     | Is JDK:             true
     | Detected by:        Current JVM

 + Temurin JDK 1.8.0_322-b06
     | Location:           C:\Users\user\.gradle\jdks\jdk8u322-b06
     | Language Version:   8
     | Vendor:             Temurin
     | Is JDK:             true
     | Detected by:        Auto-provisioned by Gradle
Eğer standart bir yere kurmuş olsaydım, gradle bunları da bulabilirdi ve indirmesi gerekmezdi. Şöyle yaparız. Linux'ta standart kurulum yeri "/usr/lib/jvm/". Bu arada Windows için JVM değiştirmek için bir yazı burada
$ gradle -q javaToolchains
 + Options
     | Auto-detection:     Enabled
     | Auto-download:      Enabled

 + OpenJDK 1.8.0_292
     | Location:           /usr/lib/jvm/java-8-openjdk
     | Language Version:   8
     | Vendor:             Oracle
     | Is JDK:             true
     | Detected by:        Current JVM

 + OpenJDK 11.0.11
     | Location:           /usr/lib/jvm/java-11-openjdk
     | Language Version:   11
     | Vendor:             Oracle
     | Is JDK:             true
     | Detected by:        Common Linux Locations
Şöyle yaparız
./gradlew --no-daemon -q javaToolchains

+ Options
    | Auto-detection:     Enabled
    | Auto-download:      Enabled

+ OpenJDK 1.7.0_261-mockbuild_2020_04_29_08_59-b00
    | Location:           /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64
    | Language Version:   7
    | Vendor:             Oracle
    | Is JDK:             true
    | Detected by:        Common Linux Locations

+ OpenJDK JRE 1.7.0_261-mockbuild_2020_04_29_08_59-b00
    | Location:           /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre
    | Language Version:   7
    | Vendor:             Oracle
    | Is JDK:             false
    | Detected by:        Common Linux Locations

+ Red Hat, Inc. JDK 1.8.0_292-b10
    | Location:           /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64
    | Language Version:   8
    | Vendor:             Red Hat, Inc.
    | Is JDK:             true
    | Detected by:        Current JVM

+ Red Hat, Inc. JDK 11.0.11+9-LTS
    | Location:           /usr/lib/jvm/java-11-openjdk-11.0.11.0.9-1.el7_9.x86_64
    | Language Version:   11
    | Vendor:             Red Hat, Inc.
    | Is JDK:             true
    | Detected by:        Common Linux Locations

+ Red Hat, Inc. JRE 1.8.0_292-b10
    | Location:           /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64/jre
    | Language Version:   8
    | Vendor:             Red Hat, Inc.
    | Is JDK:             false
    | Detected by:        Common Linux Locations
Örnek
Gradle 7.3 ve JDK 8 ile bir projeyi derlerken bazı modüllerin JDK 17 kullanması gerekti. 

- Gradle'i JDK 17 ile çalıştırdım. JDK 8 isteyen modüller için ana build.gradle dosyasında şöyle yaparız. Aslında options.release.set() kullanılmaması gerekiyordu ama nedense olmadı. Java 8 kullanması gereken modüller JDK 17 ile derlendi.
java {
  toolchain {
    languageVersion = JavaLanguageVersion.of(8)
  }
}

tasks.withType(JavaCompile) {
  options.release.set(8) //Buna gerek yok ama olmadı
}
JDK 17 isteyen modüllerde şöyle yaparız.
java {
  toolchain {
    languageVersion = JavaLanguageVersion.of(17)
  }
}
Deneme olsun diye tüm projeyi Gradle'ı JDK 8 ile derleyince, JDK 17 isteyen modüllerin olması gerektiği gibi JDK 17 ile derlendiğini gördüm. Aynı şeyin neden ilk seferdeki gibi olmadığını anlamadım.

Jenkins makinesinin internet bağlantısı olmadığı içinde JDK 17'yi indirirken şu hatayı aldım
Unable to download toolchain matching these requirements: {languageVersion=17, vendor=any, implementation=vendor-specific}
> Could not GET 
'https://api.adoptopenjdk.net/v3/binary/latest/17/ga/linux/x64/jdk/hotspot/normal/adoptopenjdk'.
Received status code 403 from server: Forbidden
Örnek
JDK 17  ayarları için şöyle yaparız
java {
  toolchain {
    languageVersion = JavaLanguageVersion.of(17)
  }
}

tasks.withType(JavaCompile) {
  options.release.set(17)
  options.compilerArgs = ['--add-modules=jdk.incubator.foreign',
                          '--enable-preview',
                          '-Xlint:preview']
}

// dependencies, etc.


15 Aralık 2021 Çarşamba

application plugin - Projeyi Çalıştırılacak Şekilde Paketler

Giriş
Açıklaması şöyle. Executable veya Fat jar yaratmaz. Sadece projeyi çalıştırmak için gerek .bat veya .sh dosyasını üretir ve projeyi zip ve tar olarak paketler.
The Application Plugin also automatically includes the Distribution Plugin. The Distribution Plugin creates two archives: TAR and ZIP. Their contents are identical and include the project jar, all dependency jars, and two scripts: Bash and .bat-file. Then, distributing our application is no problem at all: We can use our-project/build/distributions/our-project-1.0.1.zip, unpack it, and run the executable script:

$ unzip our-project-1.0.1.zip 
$ ./our-project-1.0.1/bin/our-project-1.0.1
Bu plugin yerine fat jar yaratan shadow plugin tercih edilebilir

1. Eklenen Task Listesi
Şu task'lar eklenir
- run
- startScripts
- installDist
- distZip
- distTar

installDist Task
Açıklaması şöyle
You can run gradle installDist to create an image of the application in build/install/projectName. You can run gradle distZip to create a ZIP containing the distribution, gradle distTar to create an application TAR or gradle assemble to build both.

distZip Task
build\distributions altında bir tane zip dosyası oluşturur. Bu dosyanın içeriği şöyle
bin
  foo
  foo.bat
lib
  Çeşitli jar dosyaları
2. Alanlar
distTar Alanı
Tar dosyası oluşturmayı istenmiyorsa bu alan false yapılır

mainClassName Alanı - Kullanmayın
Gradle 8 ile mainClassName yerine mainClass kullanılıyor
Örnek
Şöyle yaparız
plugins {
  id 'application'
}

application {
  mainClassName = 'com.foo.FooMain'
  applicationDefaultJvmArgs = ['-Doracle.jdbc.autoCommitSpecCompliant=false']
  distTar.enabled = false
}

distributions {
  main {
    contents {
      into('bin') {
        from 'src/main/resources'
        include 'Foo.ico'
        include 'setup.vbs'
      }
    }
  }
}
Örnek
Şöyle yaparız
distributions {
  main {
    contents {
      from 'bringup-files'
      from (project(':licensingEngine:licenseUploader').distZip) {
        include project(':licensingEngine:licenseUploader').distZip.archiveFileName
        into 'bring_up_files/license'
      }
    }
  }
}
Örnek
Şöyle yaparız
 application {
mainClass = 'org.gradle.sample.Main' }


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














12 Aralık 2021 Pazar

hierynomus license plugin - Bence İyi Çalışmıyor

Giriş
İki tane farklı plugin var ve bunlar genellikle birlikte kullanılıyor. Bunlar
1. license 
2. license-report

Bu pluginin çok iyi çalışmamasının sebebi lisans eksik hatasını tutarlı olarak vermemesi. Bir kere verdikten sonra tekrar vermiyor

Plugin için tüm ayarları başka bir dosyaya taşıyabiliriz. Şöyle yaparız
apply from: "${rootDir}/gradle/license.gradle"

1. license plugin
Örnek
build.gradle dosyasında şöyle yaparız
plugins {
  id "com.github.hierynomus.license" version "0.15.0"
}
License task içinde şöyle yaparız
//A license extension is added to the project, which can be used to configure all
//LicenseCheck and LicenseFormat
license {
  header = file("${rootDir}/config/LICENSE.template") //şablon dosya yolu 
  //variable substitution
ext.year = Calendar.getInstance().get(Calendar.YEAR) ext.name = 'Foo Inc.' ignoreFailures = true //Prevent tasks from stopping the build, defaults to false
mapping { java = 'SLASHSTAR_STYLE' //Üretilen başlık Javadoc gibidir } }
Örnek şablon dosya şöyle
Copyright (c) ${name} and/or its affiliates, ${year}

All Rights Reserved.
The software contained on this media is proprietary to and
embodies the confidential technology of the copyright holder.
Possession, use, duplication or dissemination of the software
and media is authorized only pursuant to a valid written license
from the copyright holder.
This copyright notice must appear in all copies of this software.
LicenseCheck Task
Lisansları kontrol eder ve lisans yoksa veya formatı bozuksa uyarı verir. Açıklaması şöyle
This task checks all the configured source files to validate whether the correct header has been applied. 
LicenseFormat Task - Lisans Başlığı Güncellemek
Açıklaması şöyle
This task formats all the configured source files to add a header to them if no header has been applied yet. 
IntelliJ Gradle penceresindeki 
tasks/license/licenseFormat 
çift tıklanır veya şöyle yaparız
gradle licenseFormatMain

2. license-report plugin
build.gradle dosyasında şöyle yaparız
plugins {
id "com.github.hierynomus.license-report" version "0.15.0" }
downloadLicenses Task - Dependency License Reporting
Açıklaması şöyle
generates reports on your runtime dependencies
Projede kullanılan tüm harici kütüphanelerin lisanlarını bir rapor olarak sunar. html ve json olarak çıktı verir. Raporlar şu dizinde. 
build/reports/license/
Şöyle yaparız
//generates reports on your runtime dependencies
downloadLicenses {
    ignoreFatalParseErrors = true
    includeProjectDependencies = true    
    //a pre-defined mapping of a dependency to a license; useful if the 
    //external repositories do not have license information available
licenses = [ (group('com.foo')) : license('Foo License'), (group('com.colak.myapp')) : license('My License') ]
//a List of dependencies that are to be excluded from reporting
excludeDependencies = [ 'org.wildfly.*', 'org.jboss.*', 'com.foo.bar.*', 'javax.*' ] //Gradle dependency configuration to report on (defaults to "runtime"). dependencyConfiguration = 'compile' }
Örnek
Şöyle yaparız
//You will have to specify for which configuration dependencies should be resolved.
//Following are resolvable by default:
//- compileClasspath
// - runtimeClasspath
downloadLicenses {
  includeProjectDependencies = true
  dependencyConfiguration = 'runtimeClasspath'
  // or
  // dependencyConfiguration = 'compileClasspath'
}



Gradle Proje Yapısı

Giriş
Gradle 2008 yılında ortaya çıktı. Maven repository'lerini kullanabilir. Maven gibi XML yerine Groovy DSL kullanır. Açıklaması şöyle
Gradle was first released in 2008. Building on Maven’s concepts, it was introduced as Maven’s successor. Rather than using Maven’s XML-based project configuration, it introduced a domain-specific language (DSL) based on the Groovy and Kotlin programming languages. Gradle supports Maven and Ivy repositories for declaring project configurations. It was designed with multi-project builds in mind.
Proje Yapısı Nasıldır?
Şeklen şöyle. Bu dosyalara bakalım
build.gradle
gradle    
    wrapper
        gradle-wrapper.jar
        gradle-wrapper.properties
gradlew
gradlew.bat
settings.gradle
src
    main
        java  
            App.java
    test      
        java
            AppTest.java
build.gradle Dosyası Nedir?
Kullanılacak plugin'ler ve dependencies bu dosyaya yazılır

gradlew.bat veya gradlew Dosyası Nedir?
gradle.bat dosyası Windows içindir. gradlew ise bash içindir. Açıklaması şöyle
Notice you’re using a local script, ./gradlew and not gradle itself. That’s the Gradle wrapper. It has a couple of nice advantages. First, it locks the Gradle version so that the build script is guaranteed to work with the Gradle version running it. Second, it means you don’t have to install Gradle locally.
Windows'ta farklı bir JDK ile çalıştırmak için şöyle yaparız
.\gradlew assemble -D"org.gradle.java.hom"e="D:\Kurulumlar\amazon1.8"
Gradle Çıktısı Nasıldır?
build dizinindedir. Şöyledir. Bizim istediğimiz jar dosyası libs altındadır
build
 - generatePomPropertiesFile
 - libs
 - manifest
 - publications
 - resources
 - tmp
Gradle İndirdiği Jarları Nerede Saklar?
Windows'ta yol şöyle. Yani USER_HOME altındaki acelya kullanıcısına ait dizinde
C:\Users\acelya\.gradle\caches\modules-2\files-2.1
Gradle Daemon Nedir?
Gradle Daemon Nedir? yazısına taşıdım

checkstyle plugin

Örnek
Şöyle yaparız
plugins {
  id 'java'
  id 'jacoco'
  id 'pmd'
  id 'checkstyle'
}

group 'com.datamify'
version '1.0-SNAPSHOT'

repositories {
  mavenCentral()
}

pmd {
  consoleOutput = true
  toolVersion = "6.21.0"
  rulesMinimumPriority = 5
}

checkstyle {
  toolVersion '8.40'
  ignoreFailures true
}

tasks.withType(Checkstyle) {
  reports {
    xml.required = true
    html.required = true
  }
}

jacoco plugin

Giriş
Plugin için tüm ayarları başka bir dosyaya taşıyabiliriz. Şöyle yaparız
apply from: "${rootDir}/gradle/jacoco.gradle"
Bu dosyada şöyle yaparız
apply plugin: 'jacoco'

jacoco {
  toolVersion = '0.8.7'
}

jacocoTestReport {
  reports {
    xml.enabled false
    csv.enabled false
    html.enabled true
  }
}
Açıklaması şöyle. Yani IntelliJ ile bakınca verification altında jacocoTestReport diye yeni bir task görebiliriz.
If the Java plugin is also applied to your project, a new task named jacocoTestReport is created. By default, a HTML report is generated at $buildDir/reports/jacoco/test.
Bu task başka bir şey bağlı değildir. Açıklaması şöyle. Yani test task'ını başlatınca jacoco çalışmaz.
While tests should be executed before generation of the report, the jacocoTestReport task does not depend on the test task.
Jacoco'yu elle başlatmak için şöyle yaparız. Jacoco çıktısını "build/reports/tests/test/index.html" dizininde görebiliriz.
gradlew  clean test jacocoTestReport
Eğer test ile jacoco'yu bağlamak istersek şöyle yaparız
test {
    finalizedBy jacocoTestReport // report is always generated after tests run
}
jacocoTestReport {
    dependsOn test // tests are required to run before generating the report
}
Plugin Ayarları
1. plugins Block
Şöyle yaparız
plugins { 
  id 'jacoco' 
}
2. jacoco Block
Kullanılacak sürümü belirtmek için şöyle yaparız
jacoco { 
  toolVersion = "0.8.7" 
} 
3. test Block
Şöyle yaparız
test { 
  finalizedBy jacocoTestReport 
}
4. jacocoTestReport Block
Rapor sonuçlarını hangi formatta istediğimizi belirtiriz.
Örnek
Şöyle yaparız
jacoco {
  toolVersion = '0.8.7'
}

jacocoTestReport {
  reports {
    xml.enabled false
    csv.enabled false
    html.enabled true
  }
}
Örnek
Şöyle yaparız
jacocoTestReport {
  reports {
    xml.enabled true
  }
}
Örnek
Test task'ına bağlamak için şöyle yaparız
plugins {
  id "org.sonarqube" version "$sonarQubeVersion"
  id "jacoco"
}

jacoco {
  toolVersion = "0.8.6"
  reportsDir = file("$buildDir/jacocoreports")
}

jacocoTestReport {
  reports {
    xml.enabled true
  }
}

test.finalizedBy jacocoTestReport
Sonar ile birleştirmek için şöyle yaparız
sonarqube {
  properties {
    property 'sonar.coverage.exclusions', '**/dto/**,**/util/**,**/ResponseExceptionHandler.java,,**/Application.java'
     property 'sonar.coverage.jacoco.xmlReportPaths', "$buildDir/jacocoreports/test/jacocoTestReport.xml"
  }
}
Örnek
Şöyle yaparız
jacocoTestReport { 
  dependsOn test 
  reports { 
    xml.required = true 
    csv.required = true 
    html.required = true 
  } 
}
5. jacocoTestCoverageVerification  Block
Şöyle yaparız
jacocoTestCoverageVerification {
  violationRules {
    rule {
      limit {
        minimum = 0.8
      }
    }
    rule {
      limit {
        counter = 'BRANCH'
        value = 'COVEREDRATIO'
        minimum = 0.8
      }
    }
  }
}
Örnek
Kapsama yüzdesini check task'ına bağlamak için şöyle yaparız
check.dependsOn jacocoTestCoverageVerification
Örnek
Şöyle yaparız
plugins {
  id 'java'
  id 'jacoco'
}

dependencies {
  testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
  testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}

test {
  useJUnitPlatform()
  finalizedBy jacocoTestReport
}

jacocoTestReport {
  dependsOn test
  reports {
    html.required = true
  }
}

jacocoTestCoverageVerification {
  violationRules {
    rule {
      limit {
      minimum = 0.8
    }
  }
  }
}

check.dependsOn jacocoTestCoverageVerification


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...