После некоторого исследования я выяснил, что зависимости модулей в Gradle разрешаются с помощью файлов .jar:
<dependent-module>.classpath contains <dependency-module>.jar
Итак, в моем случае мне нужно создать специальный jar-файл, содержащий инструментированные классы.
Инструментарий классов
task preprocessClassesForJacoco(dependsOn: ['classes']) {
ext.outputDir = buildDir.path + '/classes-instrumented'
doLast {
ant.taskdef(name: 'instrument',
classname: 'org.jacoco.ant.InstrumentTask',
classpath: configurations.jacoco.asPath)
ant.instrument(destdir: outputDir) {
fileset(dir: sourceSets.main.java.outputDir, includes: '**/*.class', erroronmissingdir: false)
}
}
}
Следующим шагом будет сборка инструментальной банки :
task jacocoInstrumentedJar(type: Jar, dependsOn: [preprocessClassesForJacoco]) {
baseName "${project.name}-instrumented"
from preprocessClassesForJacoco.outputDir // path to instrumented classes
}
И, наконец, мы нужно заменить обычный .jar на инструментированный one
gradle.taskGraph.whenReady { graph ->
if (graph.hasTask(preprocessClassesForJacoco)) {
tasks.withType(Test) {
doFirst {
...
// getting a module dependencies
def modulesDependencies = moduleDependencies(project)
// removing regular jars
classpath -= files(modulesDependencies.jar.outputs.files)
// adding instrumented jars
classpath += files(modulesDependencies.jacocoInstrumentedJar.outputs.files)
}
}
}
}
Я обновил пример проекта https://github.com/SurpSG/jacoco-offline-instrumentation с описанными шагами над. Не стесняйтесь проверить проект, чтобы попробовать.