The Feature Lifecycle
Gradle is under constant development. New versions are delivered on a regular and frequent basis (approximately every 6 weeks) as described in the section on end-of-life support.
Continuous improvement combined with frequent delivery allows new features to be made available to users early. Early users provide invaluable feedback which is incorporated into the development process.
Getting new functionality into the hands of users regularly is a core value of the Gradle platform.
At the same time, API and feature stability is taken very seriously and is also considered a core value of the Gradle platform. This is something that is engineered into the development process by design choices and automated testing and formalized by the section on backward compatibility.
The Gradle feature lifecycle has been designed to meet these goals. It also serves to communicate to users of Gradle what the state of a feature is. The term feature typically means an API or DSL method or property in this context, but it is not restricted to this definition. Command line arguments and modes of execution (e.g. the Build Daemon) are two examples of other kinds of features.
Features can be in one of four states:
Internal features are not designed for public use and are only intended to be used by Gradle itself. They can change in any way at any point in time without any notice. Therefore, we recommend avoiding the use of such features. Internal features are not documented. If it appears in this User Manual, the DSL Reference, or the API Reference, then the feature is not internal.
Internal features may evolve into public features.
Features are introduced in the incubating state to allow real-world feedback to be incorporated into the feature before it is made public. It also gives users who are willing to test potential future changes early access.
A feature in an incubating state may change in future Gradle versions until it is no longer incubating. Changes to incubating features for a Gradle release will be highlighted in the release notes for that release. The incubation period for new features varies depending on the scope, complexity, and nature of the feature.
Features in incubation are indicated. In the source code, all methods/properties/classes that are incubating are annotated with incubating. This results in a special mark for them in the DSL and API references.
If an incubating feature is discussed in this User Manual, it will be explicitly said to be in the incubating state.
The feature preview API allows certain incubating features to be activated by adding
enableFeaturePreview('FEATURE') in your settings file.
Individual preview features will be announced in release notes.
When incubating features are either promoted to public or removed, the feature preview flags for them become obsolete, have no effect, and should be removed from the settings file.
The default state for a non-internal feature is public. Anything that is documented in the User Manual, DSL Reference, or API reference that is not explicitly said to be incubating or deprecated is considered public. Features are said to be promoted from an incubating state to public. The release notes for each release indicate which previously incubating features are being promoted by the release.
A public feature will never be removed or intentionally changed without undergoing deprecation. All public features are subject to the backward compatibility policy.
Some features may be replaced or become irrelevant due to the natural evolution of Gradle. Such features will eventually be removed from Gradle after being deprecated. A deprecated feature may become stale until it is finally removed according to the backward compatibility policy.
Deprecated features are indicated to be so.
In the source code, all methods/properties/classes that are deprecated are annotated with “
@java.lang.Deprecated” which is reflected in the DSL and API References.
In most cases, there is a replacement for the deprecated element, and this will be described in the documentation.
Using a deprecated feature will result in a runtime warning in Gradle’s output.
The use of deprecated features should be avoided. The release notes for each release indicate any features that are being deprecated by the release.
Gradle provides backward compatibility across major versions (e.g.
Once a public feature is introduced in a Gradle release, it will remain indefinitely unless it is deprecated.
Once deprecated, it may be removed in the next major release.
Deprecated features may be supported across major releases, but this is not guaranteed.
Every day, a new nightly build of Gradle is created.
This contains all of the changes that have made it through Gradle’s extensive continuous integration tests during that day. Nightly builds may contain new changes that may or may not be stable.
For each minor or major release, the Gradle team creates a pre-release distribution called a release candidate (RC). When no problems are found after a short time (usually a week), the release candidate is promoted to a general availability (GA) release. If a regression is found in the release candidate, a new RC distribution is created and the process repeats. Release candidates are supported for as long as the release window is open, but they are not intended to be used for production. Bug reports are greatly appreciated during the RC phase.
The Gradle team may create additional patch releases that are intended to replace the final release due to important bug fixes or regressions. For instance, Gradle 5.2.1 replaces the Gradle 5.2 release.
Once a release candidate has been made, all feature development moves on to the next release for the latest major version. As such, each minor Gradle release causes the previous minor releases in the same major version to become end-of-life (EOL). EOL releases do not receive bug fixes or feature backports.
For major versions, Gradle will backport critical fixes and security fixes to the last minor in the previous major version. For example, when Gradle 7 was the latest major version, several releases in the 6.x line, including Gradle 6.9 (and subsequent releases) were made.
As such, each major Gradle release causes:
The previous major version becomes maintenance only and it will only receive critical bug fixes and security fixes.
The major version before the previous one to become end-of-life (EOL), and that release line will not receive any new fixes.