23 Aralık 2021 Perşembe

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"
}


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