War Overlaying - Opinions

Hi everybody,

I am asking for a short opinion regarding the following war overlaying solutions.

  • Which of the following possible solutions should be preferred?
  • Or is there an even better/faster/IDE-friendlier solution that I have not seen yet?

1. A slightly hacky solution, but it works well:

configurations {
    warOverlay {
        transitive = false
    }
    compile.extendsFrom(warOverlay)
}

dependencies {
    warOverlay project(':war1')
    warOverlay project(':war2')
}

war {
    duplicatesStrategy = 'exclude'
    configurations.warOverlay.each {
        from zipTree(it.path.replace(".jar", ".war"))
    }
}

2. The maybe more correct™ solution:

The modules (war1 and war2) must expose their war artifact:

configurations {
    thewar
}

artifacts {
    thewar tasks.war
}

The final wapapp itself:

configurations {
    warOverlay {
        transitive = false
    }
}

dependencies {
    compile project(':war1')
    compile project(':war2')
    warOverlay project(path:':war1', configuration: 'thewar')
    warOverlay project(path:':war2', configuration: 'thewar')
}

war {
    duplicatesStrategy = 'exclude'
    configurations.warOverlay.filter({it.name.endsWith(".war")}).each {
        from zipTree(it)
    }
}

3. Using a third party plugin

I don’t really want to depend on a third party plugin if it is not absolutely necessary.