Create separate shadowJars for code and dependencies

Viewed 199

Using the gradle shadowJar plugin version 4.0.2 and gradle 4.10, I wanted to create two separate shadowJars, one for my source code and another for my dependencies (since dependencies are large and rarely changes I don’t want to repackage them every time I change my source code). What I have in mind is to have a gradle plugin that adds two separate tasks and which takes the same configurations supplied by user for shadowJar and overrides the configurations/sources used to create the shadowJar.

Below is what I have got so far, still trying to figure out a clean way to pass the shadow configs only once and whether there are other gotchas I need to worry about (ex: having two mergeServiceFiles will break etc)

import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar

task dependencyShadowJar(type: ShadowJar) {
 mergeServiceFiles()
 zip64 = true
 relocate 'com.google.common', 'com.shadow.com.google.common'
 classifier = 'dependencies'
 configurations = [project.configurations.runtime]
}

task userCodeShadowJar(type: ShadowJar) {
 mergeServiceFiles()
 zip64 = true
 relocate 'com.google.common', 'com.shadow.com.google.common'
 classifier = 'mycode'
 from sourceSets.main.output
}

task splitShadowJar {
 doLast {
    println "Building separate src and dependency shadowJars"
 }
}

splitShadowJar.dependsOn dependencyShadowJar
dependencyShadowJar.dependsOn userCodeShadowJar
  • Ideally I would like to have a shadowJar settings specified once and the tasks copies the same settings, does that require creating a custom Plugin task in groovy ?
  • Can I copy the settings from existing shadowJar that user specifies and just overrides the from or configurations part alone for my purpose

Anybody has attempted something similar ?

0 Answers
Related