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