Output multiple jars with changed variable

(Dogboy21) #1


is it possible to output multiple jars from the same project, each with a changed variable in the Java source code?
So in jar 1 variable a is set to 1, in jar 2 variable a is set to 2.

(Stefan Oehme) #2

In general yes, but can you tell us about the use case first?

(Dogboy21) #3

Sure. I’m writing a Minecraft mod which patches base classes via ASM. We have many different environments in our network which need different ASM transformers, so I want a jar per environment

(Stefan Oehme) #4

Thanks for the example! I’m just asking because it would be much easier if you could do this with a system property instead of creating different code for each environment. Or possibly a Java agent that does the ASM manipulation at load time instead of at build time.

If that’s not possible, then here’s a relatively complete example of the tasks you’d need to enhance classes, create a jar and prepare it for publishing:

//your class enhancing task
task mySpecialClasses() {
  inputs.files fileTree(sourceSets.main.output.classesDir)
  outputs.dir "$buildDir/classes/special/main"
  doLast {
    //invoke your transformer, transforming input classes into the output dir

//build a Jar from the output of the enhancer
task mySpecialJar(type:Jar) {
  from mySpecialClasses
  classifier = 'special'

//tell Gradle that this jar is one of your published archives
artifacts {
  archives mySpecialJar

(Dogboy21) #5

The ASM manipulation is done during load time

(Stefan Oehme) #6

If it’s done during load time, why do you need multiple jars? The code can discover the environment itself at load time and decide which transformation to apply.

(Dogboy21) #7

Minecraft is a bit different with it’s ASM handling. ASM transformers need to be registered before everything else is loaded, so I cannot identify which transformer to use

(Stefan Oehme) #8

But your transformer is a plain old jar. It can contain all code for all platforms and decide what to do based on the environment.