Hi Mick, A complete working example, as per how I achieved the results I was looking for, is as follows (now including cobertura reporting): Hope it helps!
============================= apply plugin: 'java' // http://www.gradle.org/java_plugin.html // http://www.gradle.org/multi_project_builds.html if (getProject().properties['codeCoverageProvider']==null) getProject().setProperty('codeCoverageProvider', '/mnt/data/bin/cobertura-1.9.4.1') def buildTime = new java.util.Date() configurations{ zkm instrumentation } dependencies { instrumentation files("${project.buildDir}/cobertura-instrumentation") testRuntime files("${codeCoverageProvider}/cobertura.jar") testCompile files("${buildLibs}/junit.jar") zkm files(zelix_lib) compile files("${buildLibs}/xstream-1.3.1.jar") } sourceSets { main { java { srcDir 'src' } resources { srcDir 'src' } } test { java { srcDir 'test' } resources { srcDir 'test' } runtimeClasspath = configurations.instrumentation + runtimeClasspath } } test{ workingDir = new File("${junitWorkingDir}") ignoreFailures = true systemProperties['net.sourceforge.cobertura.datafile'] = "${project.buildDir}/cobertura.ser" } task obfuscate(dependsOn: classes) << { javaexec { // as per http://mrhaki.blogspot.com/2010/09/gradle-goodness-run-java-application.html main = 'ZKM' classpath = configurations.zkm + sourceSets.main.runtimeClasspath args "$projectDir/script.txt" jvmArgs "-DSaveAllDir=$buildDir/obfuscated-classes-extra" } } task jar(dependsOn: obfuscate, type: Jar, overwrite: true){ // we provide our own main jar task manifest.from("src/META-INF/MANIFEST.MF") // because our main jar should be obfuscated manifest.attributes 'Build-Time': buildTime.toString() from project.sourceSets.main.resources from "$buildDir/obfuscated-classes-extra" } task unobfuscatedJar(dependsOn: classes, type: Jar) { // we also provide an extra jar task, to provide our unobfuscated jar baseName = "${project.name}-unobfuscated" manifest.from("src/META-INF/MANIFEST.MF") manifest.attributes 'Build-Time': buildTime.toString() from "$buildDir/classes/main" } test.doFirst { // coverage println "Setting up cobertura code coverage instrumentation" ant.taskdef(resource:'tasks.properties') { classpath { pathelement(location:"${codeCoverageProvider}/cobertura.jar") fileset(dir:"${codeCoverageProvider}/lib", includes:'*.jar') } } println "instrumentation to: ${project.buildDir}/cobertura-instrumentation" ant.'cobertura-instrument'(toDir: "${project.buildDir}/cobertura-instrumentation", datafile: "${project.buildDir}/cobertura.ser"){ fileset(dir: "${sourceSets.main.classesDir}"){ include(name: "**/*.class") } } } test.doLast{ println "Writing cobertura report" ant.'cobertura-report'(destdir: "${project.buildDir}/cobertura-report", datafile: "${project.buildDir}/cobertura.ser"){ sourceSets.main.java.srcDirs.each { dir -> if (dir.isDirectory()){ fileset(dir: "${dir}"){ include(name: "**/*.java") } } } } }
