Gradle Release Notes

Version 5.0-milestone-1

The Gradle team is pleased to announce Gradle 5.0.

We are excited to share some great new features and improvements with you in this release:

First and foremost, Gradle Kotlin DSL is now production-ready with it's 1.0 release! Authoring your build logic using Kotlin provides significant additional editing assistance in IDEs, including: improved completion, error highlighting, and refactoring tools. Please follow our migrating build logic from Groovy to Kotlin guide if you're interested. If you prefer the flexibility and dynamic nature of Groovy, that's totally okay — the Groovy DSL will never be deprecated.

You can now specify a timeout duration for a task, after which it will be interrupted. Read more about task timeouts in the docs.

Next up, this version of Gradle introduces dependency version alignment. This allows different modules belonging to the same logical group ( platform ) to have identical versions in a dependency graph. Maven BOMs can be imported to define platforms as well.

dependencies { implementation ( dependencies . enforcedPlatform ( "org.springframework.boot:spring-boot-dependencies:1.5.8.RELEASE" )) implementation ( "com.google.code.gson:gson" ) implementation ( "dom4j:dom4j" ) implementation ( "org.codehaus.groovy:groovy:1.8.6" ) }

Moving on, gradle init functionality has been upgraded in this release: is now optionally interactive, includes new kotlin-library and kotlin-application project types, provides options for configuring project and package names, and more.

This release introduces useful changes for plugin and custom task authors, including an API for creating SourceDirectorySet s, improvements to the Provider API, and improved build cache compatibility.

Finally, because this is a new major version of Gradle, many of the things that were deprecated in the Gradle 4.x versions have been removed. For example, running Gradle now requires Java 8 or higher (though tests can be run using Java 6 or 7). It is recommended that you

read the upgrading from Gradle 4.x to 5.0 document

upgrade to Gradle 4.10.2

run gradle help --scan and look at the "Deprecations" view

and look at the "Deprecations" view you can also use gradle help --warning-mode=all , though it may not report as much detailed information

to find and fix all deprecated build logic.

We hope you will build happiness with Gradle 5.0, and we look forward to your feedback via Twitter or on GitHub.

New and noteworthy Here are the new features introduced in this Gradle release. Build init plugin improvements This release includes a number of improvements to The Build Init plugin. Interactive mode If you run the init task from an interactive console, it will prompt you for details of the Gradle build that you'd like to generate. Kotlin library and applications The init task can generate a Kotlin library or application, using the kotlin-library or kotlin-application setup type. This was one of our top 10 most voted issues. Generated builds use recommended configurations The init task generates build scripts that use the recommended implementation , testImplementation , and testRuntimeOnly configurations instead of compile , testCompile , and testRuntime , respectively, for all build setup types. Configure project and source package names The init task provides a --project-name option to allow you to adjust the name of the generated project, and a --package option to allow you to adjust the package for the generated source. The task will also allow you to specify these if you run the task interactively. Create resource directories The init task creates empty resource directories. Create a .gitignore file While the init task does not automatically create a Git repository, the init task generates a simple .gitignore file to make it easier for you to set up a Git repository. This .gitignore file ignores Gradle's build outputs. Plugin authoring features Public method to create SourceDirectorySet instances The SourceDirectorySet type is often used by plugins to represent some set of source directories and files. Previously, it was only possible to create instances of SourceDirectorySet using internal types. This is problematic because when a plugin uses internal types it can often break when new versions of Gradle are released because internal types may change in breaking ways between releases. In this release of Gradle, the ObjectFactory service, which is part of the public API, now includes a method to create SourceDirectorySet instances. Plugins can now use this method instead of the internal types. Added Provider.flatMap() method TBD - why this is useful Provider implementations track their producer task TBD - More provider implementations track the task that produces the value of the provider: - Any provider returned by TaskContainer - Any property marked with @OutputFile or @OutputDirectory - Any provider returned by Provider.map() that matches these criteria (including this one) Changes to file and directory property construction ObjectFactory is now used to create file and directory Property instances, similar to other Property types. Previously, this was done using either the methods on DefaulTask , which was available only for DefaultTask subclasses, or using ProjectLayout , only available for projects. Now a single type ObjectFactory can be used to create all property instances in a Gradle model object. These other methods have been deprecated and will be removed in Gradle 6.0. JaCoCo plugin now works with the build cache and parallel test execution The JaCoCo plugin plugin now works seamlessly with the build cache. When applying the plugin with no extra configuration, the test task stays cacheable and parallel test execution can be used. In order to make the tasks cacheable when generating execution data with append = true , the tasks running with code coverage are configured to delete the execution data just before they starts executing. In this way, stale execution data, which would cause non-repeatable task outputs, is removed. Since Gradle now takes care of removing the execution data, the JacocoPluginExtension.append property has been deprecated. The JaCoCo agent is always configured with append = true , so it can be used when running tests in parallel. Plural task output properties don't disable caching anymore When using @OutputFiles or @OutputDirectories with an Iterable type, Gradle used to disable caching for the task with the following message: Declares multiple output files for the single output property 'outputFiles' via @OutputFiles, @OutputDirectories or TaskOutputs.files() This is no longer the case, and using such properties doesn't prevent the task from being cached. The only remaining reason to disable caching for the task is if the output contains file trees. Task timeouts You can now specify a timeout for a task, after which it will be interrupted. See the user guide section on “Task timeouts” for more information.

Promoted features Promoted features are features that were incubating in previous versions of Gradle but are now supported and subject to backwards compatibility. See the User guide section on the “Feature Lifecycle” for more information. The following are the features that have been promoted in this Gradle release.

Fixed issues Reporting of TestNG classes/methods When using a recent version of TestNG (6.9.13.3 or newer), classes were reported to TestListeners as sibling TestDescriptors of test method TestDescriptors . Now, TestDescriptors of classes are parents of their enclosing method TestDescriptors .

Deprecations Features that have become superseded or irrelevant due to the natural evolution of Gradle become deprecated, and scheduled to be removed in the next major Gradle version (Gradle 6.0). See the User guide section on the “Feature Lifecycle” for more information. The following are the newly deprecated items in this Gradle release. If you have concerns about a deprecation, please raise it via the Gradle Forums. StartParameter properties The following properties are deprecated and will be removed in Gradle 6.0. interactive

recompileScripts Removing tasks from TaskContainer Removing tasks from the TaskContainer using the following methods has been deprecated and will be an error in Gradle 6.0. remove(Object)

removeAll(Collection)

retainAll(Collection)

clear()

Iterator#remove() via TaskContainer#iterator() With the deprecation of every method for removing a task, registering a callback when an object is removed is also deprecated ( whenObjectRemoved(Closure/Action) ). These methods will be removed in Gradle 6.0 Replacing tasks It is only safe to replace an unrealized tasks registered with the new Task API because this task has not been used by anything else. In Gradle 6.0, these behaviors will be treated as errors. Replacing tasks that may still be used by other tasks Gradle now emits a deprecation warning when you attempt to replace a task that may have already been used by something else. Replacing tasks with a task of an incompatible type Gradle now emits a deprecation warning when you attempt to replace a task with a type that's incompatible from the task being replaced. Replacing a task that does not exist Gradle now emits a deprecation warning when you attempt to replace a task that does not already exist. Removing dependencies from a task In the next major release (6.0), removing dependencies from a task will become an error. Gradle will emit a deprecation warning for code such as foo.dependsOn.remove(bar) . Removing dependencies in this way is error-prone and relies on the internal implementation details of how different tasks are wired together. At the moment, we are not planning to provide an alternative. In most cases, task dependencies should be expressed via task inputs instead of explicit dependsOn relationships. Incubating factory methods for creating properties TBD - The methods on DefaultTask and ProjectLayout that create file and directory Property instances have been deprecated and replaced by methods on ObjectFactory . These deprecated methods will be removed in Gradle 6.0. TBD - The ObjectFactory.property(type) , listProperty(type) and setProperty(type) methods no longer set an initial value for the property. Instead, you can use the value() or empty() methods, or any other mutation method, on the property instances to set an initial value, if required. The property append on JacocoTaskExtension has been deprecated See above for details. Deprecated announce plugins The announce and build announcements plugins have been deprecated. Deprecated OSGi plugin The osgi plugin has been deprecated. Builds should migrate to the biz.aQute.bnd plugin. Deprecated code quality plugins The FindBugs plugin has been deprecated because the project is unmaintained and does not work with bytecode compiled for Java 9 and above. Please consider using the SpotBugs plugin instead.

The JDepend plugin has been deprecated because the project is unmaintained and does not work with bytecode compiled for Java 8 and above.

Potential breaking changes Fixes to dependency resolution Dependency resolutions fixes have been included in this release. By definition this could impact the set of resolved dependencies of your build. However the fixed issues are mostly about corner cases and combination with recent features and thus should have a limited impact. When a dependency constraint matched a real dependency, it was made part of the graph. However if for some reason the dependency was later evicted from the graph, the constraint remained present. Now when the last non-constraint edge to a dependency disappears, all constraints for that dependency will be properly removed from the graph. Gradle 5.0 requires Java 8 Gradle can no longer be run on Java 7, but requires Java 8 as the minimum build JVM version. However, you can still use forked compilation and testing to build and test software for Java 6 and above. Configuration Avoidance API disallows common configuration errors The configuration avoidance API introduced in Gradle 4.9 allows you to avoid creating and configuring tasks that are never used. With the existing API, this example adds two tasks ( foo and bar ): tasks.create("foo") { tasks.create("bar") } When converting this to use the new API, something surprising happens: bar doesn't exist. The new API only executes configuration actions when necessary, so the register() for task bar only executes when foo is configured. tasks.register("foo") { tasks.register("bar") // WRONG } To avoid this, Gradle now detects this and prevents modification to the underlying container (through create or register ) when using the new API. Java Library Distribution Plugin utilizes Java Library Plugin The Java Library Distribution Plugin is now based on the Java Library Plugin instead of the Java Plugin. Additionally the created distribution will contain all artifacts of the runtimeClasspath configuration instead of the deprecated runtime configuration. Removed support for Play Framework 2.2 The previously deprecated support for Play Framework 2.2 has been removed. JaCoCo plugin deletes execution data on task execution See above for details. Checkstyle plugin config directory in multi-project builds Gradle will now, by convention, only look for Checkstyle configuration files in the root project's config/checkstyle directory. Checkstyle configuration files in subprojects — the old by-convention location — will be ignored unless you explicitly configure their path via checkstyle.configDir or checkstyle.config . The default tool versions of the following code quality plugins have been updated: The Checkstyle plugin now uses 8.12 instead of 6.19 by default.

The CodeNarc plugin now uses 1.2.1 instead of 1.1 by default.

The JaCoCo plugin now uses 0.8.2 instead of 0.8.1 by default.

The PMD plugin now uses 6.7.0 instead of 5.6.1 by default. In addition, the default ruleset was changed from the now deprecated java-basic to category/java/errorprone.xml . We recommend configuring a ruleset explicitly, though. Library upgrades Several libraries that are used by Gradle have been upgraded: Groovy was upgraded from 2.4.15 to 2.5.2 (see http://groovy-lang.org/releasenotes/groovy-2.5.html about the changes in this release).

Ant has been upgraded from 1.9.11 to 1.9.13.

The AWS SDK used to access S3 backed Maven/Ivy repositories has been upgraded from 1.11.267 to 1.11.407.

The BND library used by the OSGi plugin has been upgraded from 3.4.0 to 4.0.0.

The Google Cloud Storage JSON API Client Library used to access Google Cloud Storage backed Maven/Ivy repositories has been upgraded from v1-rev116-1.23.0 to v1-rev136-1.25.0.

Ivy has been upgraded from 2.2.0 to 2.3.0.

The JUnit Platform libraries used by the Test task have been upgraded from 1.0.3 to 1.3.1.

task have been upgraded from 1.0.3 to 1.3.1. The Maven Wagon libraries used to access Maven repositories have been upgraded from 2.4 to 3.0.0.

SLF4J has been upgraded from 1.7.16 to 1.7.25. CopySpec.duplicatesStrategy is no longer nullable For better compatibility with the Kotlin DSL, the property setter no longer accepts null as a way to reset the property back to its default value. Use DuplicatesStrategy.INHERIT instead. CheckstyleReports and FindbugsReports html property now return CustomizableHtmlReport For easier configurability from statically compiled languages such as Java or Kotlin. Javadoc and Groovydoc delete destination dir The Javadoc and Groovydoc tasks now delete the destination dir for the documentation before executing. This has been added to remove stale output files from the last task execution. Changes to property factory methods on DefaultTask Property factory methods on DefaultTask are final The property factory methods such as newInputFile() are intended to be called from the constructor of a type that extends DefaultTask . These methods are now final to avoid subclasses overriding these methods and using state that is not initialized. Inputs and outputs are not automatically registered The Property instances that are returned by these methods are no longer automatically registered as inputs or outputs of the task. The Property instances need to be declared as inputs or outputs in the usual ways, such as attaching annotations such as @OutputFile or using the runtime API to register the property. Previously: ``` class MyTask extends DefaultTask { // note: no annotation here final RegularFileProperty outputFile = newOutputFile() } task myOtherTask { def outputFile = newOutputFile() doLast { ... } } ``` Now: ``` class MyTask extends DefaultTask { @OutputFile // property needs an annotation final RegularFileProperty outputFile = project.objects.fileProperty() } task myOtherTask { def outputFile = project.objects.fileProperty() outputs.file(outputFile) // or to be registered using the runtime API doLast { ... } } ``` Source and test source dirs in IdeaModule no longer contain resources The IdeaModule Tooling API model element contains methods to retrieve resources and test resources so those elements were removed from the result of IdeaModule#getSourceDirs() and IdeaModule#getTestSourceDirs() . Source task source field access In previous Gradle versions the source filed in SourceTask was accessible from subclasses. This is not the case anymore as the source filed is now declared as private . The left shift operator on the Task interface is no longer supported The left shift ( << ) operator acted as an alias for adding a doLast action to an existing task. It was deprecated since Gradle 3.2 and has now been removed. Invalid project and domain object names are no longer supported Previously, it was deprecated for project and domain object names to be empty, start or end with . or contain any of the following characters: /\:<>"?*| . The use of such names now causes the build to fail. Evaluation of the publishing {} block is now eager In Gradle 4.8, the old behavior of the publishing {} block to defer its evaluation was deprecated. A new behavior that made its evaluation eager (like for any other block) was introduced and switched on using enableFeaturePreview('STABLE_PUBLISHING') . Now, the old behavior has been removed and switching on the new one is no longer necessary. If you need to defer evaluation, please use afterEvaluate {} . Changes to previously deprecated APIs The org.gradle.plugins.signing.Signature methods getToSignArtifact() and setFile(File) are removed.

methods and are removed. Removed DirectoryBuildCache.targetSizeInMB .

. Removed the methods dependsOnTaskDidWork and deleteAllActions from Task .

and from . Removed the methods execute , getExecuter , setExecuter , getValidators and addValidator from TaskInternal .

, , , and from . Removed the methods stopExecutionIfEmpty and add from FileCollection .

and from . Removed the ability to cast (Groovy as ) FileCollection to File[] and File .

) to and . Removed the method getBuildDependencies from AbstractFileCollection .

from . Removed the methods file and files from TaskDestroyables .

and from . Removed the property styleSheet from ScalaDocOptions .

from . Removed the methods newFileVar and newDirectoryVar from ProjectLayout .

and from . Removed the method property from ProviderFactory .

from . Removed the method property from Project .

from . Removed the method property from Script .

from . Removed the method leftShift from Task .

from . Removed the type RegularFileVar .

. Removed the type DirectoryVar .

. Removed the type PropertyState .

. Removed the method configureForSourceSet from JavaBasePlugin

from Removed the property classesDir from JDepend .

from . Removed the property testClassesDir from Test .

from . Removed the property classesDir from SourceSetOutput .

from . Removed IdeaPlugin.performPostEvaluationActions and EclipsePlugin.performPostEvaluationActions

and Removed ConfigurableReport.setDestination(Object)

Removed the internal @Option and @OptionValues annotations from the org.gradle.api.internal.tasks.options package.

and annotations from the package. Removed the @DeferredConfigurable annotation.

annotation. Removed the method isDeferredConfigurable from ExtensionSchema

from Forbid passing null as configuration action to the methods from and to on CopySpec .

as configuration action to the methods and on . Removed the property bootClasspath from CompileOptions .

from . Validation problems for inputs or outputs registered via the runtime API now fail the build.

Chaining calls to the methods file , files , and dir on TaskInputs is now impossible.

, , and on is now impossible. Chaining calls to the methods file , files , and dir on TaskOutputs is now impossible.

, , and on is now impossible. Chaining calls to the method property and properties on TaskInputs is now an error.

and on is now an error. JavaPluginConvention is now abstract.

is now abstract. ApplicationPluginConvention is now abstract.

is now abstract. WarPluginConvention is now abstract.

is now abstract. EarPluginConvention is now abstract.

is now abstract. BasePluginConvention is now abstract.

is now abstract. ProjectReportsPluginConvention is now abstract. Removal of deprecated CLI options Removed --no-search-upward ( -u ) option.

( ) option. Removed --recompile-scripts option. Implicit imports for internal classes have been removed Classes in the internal org.gradle.util package are no longer implicitly imported by default. Please either stop using internal classes (recommended) or import them explicitly at the top of your build file. Removed system properties The test.single filter mechanism has been removed. You must select tests from the command-line with --tests .

filter mechanism has been removed. You must select tests from the command-line with . The test.debug mechanism to enable debugging of JVM tests from the command-line has been removed. You must use --debug-jvm to enable debugging of test execution.

mechanism to enable debugging of JVM tests from the command-line has been removed. You must use to enable debugging of test execution. The org.gradle.readLoggingConfigFile system property no longer does anything — please update affected tests to work with your java.util.logging settings. Replacing built-in tasks In earlier versions of Gradle, builds were allowed to replace tasks that may be automatically created. This was deprecated in Gradle 4.8 and has now been turned into an error. Attempting to replace a built-in task will produce an error similar to the following: Cannot add task 'wrapper' as a task with that name already exists. The full list of built-in tasks that cannot be replaced: wrapper , init , help , tasks , projects , buildEnvironment , components , dependencies , dependencyInsight , dependentComponents , model , properties Changes to internal APIs Removed the internal class SimpleFileCollection .

. Removed the internal class SimpleWorkResult .

. Removed the internal method getAddAction from BroadcastingCollectionEventRegister . Gradle TestKit will search upwards for settings.gradle When invoking a build, Gradle TestKit now behaves like a regular Gradle invocation, and will search upwards for a settings.gradle file that defines the build. Please ensure that all builds being executed with Gradle TestKit define settings.gradle , even if this is an empty file. Cannot specify --source-path directly as a Java compiler arg Adding -sourcepath or --source-path to the CompileOptions.compilerArgs list is now prohibited. The source path for a JavaCompile task should be set via the CompileOptions.sourcePath property.