Filed under: Gradle, — Tags: Deprecation — Thomas Sundberg — 2017-08-14
When upgrading from Gradle 3 to Gradle 4, I got a deprecation warning in my build. The message looked like this:
Gradle now uses separate output directories for each JVM language, but this build assumes a single directory for all classes from a source set. This behaviour has been deprecated and is scheduled to be removed in Gradle 5.0 at build_6ku42cnecj8o3fcbd4eugmgr$_run_closure3.doCall(/Users/tsu/projects/tsu/thinkcode.se/build.gradle:37) The setTestClassesDir(File) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use the setTestClassesDirs(FileCollection) method instead. at build_6ku42cnecj8o3fcbd4eugmgr$_run_closure3.doCall(/Users/tsu/projects/tsu/thinkcode.se/build.gradle:37)
My question was "What? How do I upgrade my build to get rid of the warning?". I searched but neither Google nor Gradle had a migration plan ready for me.
The code Gradle was complaining about looked like this:
task acceptanceTest(type: Test) { description = 'Runs the acceptance tests' group = 'verification' testClassesDir = sourceSets.acceptanceTest.output.classesDir classpath = sourceSets.acceptanceTest.runtimeClasspath }
The line Gradle complains about is this: testClassesDir = sourceSets.acceptanceTest.output.classesDir
where I define where the compiled tests should be found.
This test task runs my acceptance tests that are defined in a separate source set. This allows me to define a separate set of acceptance tests. My acceptance tests are slow so I don't want them mixed with my unit tests.
The source set I use for the separation looks like this:
sourceSets { acceptanceTest { java.srcDir file('src/acceptanceTest/java') resources.srcDir file('src/acceptanceTest/resources') compileClasspath += main.output + test.output + configurations.testRuntime runtimeClasspath += output + compileClasspath } }
The deprecation warning wants me to refer to all of the output directories for the test classes. In this case I only have one.
My solution is to update how I refer to the output directory. I updated the test task like this:
task acceptanceTest(type: Test) { description = 'Runs the acceptance tests' group = 'verification' testClassesDirs = sourceSets.acceptanceTest.output classpath = sourceSets.acceptanceTest.runtimeClasspath }
The offending line has been updated to testClassesDirs = sourceSets.acceptanceTest.output
and the
deprecation warning is gone.
I would like to thank Malin Ekholm for finding my typos.