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