We are excited to announce Gradle 9.5.0 (released 2026-04-28).
This release improves diagnostics and reporting with task provenance in errors and reports that helps to quickly locate the source of a failing task, plus clearer logging when the client JVM is incompatible with daemon requirements, which makes it easier to diagnose unexpected daemon behavior.
Plugin authors gain type-safe Kotlin accessors for precompiled Settings convention plugins that provide IDE autocompletion and compile-time checking, automatic retry support for Wrapper downloads, and the ability to lock Domain Object Collections so that plugins can protect their configured elements from being modified by other plugins.
Build authoring adds a new environment variable to specify the network address used for client-daemon communication in environments with restrictive network configurations. Other improvements include an additional gradle init option that specifies a target directory, easier Develocity integration, and improved --help output. Finally, the Tooling API now exposes help and version information.
We would like to thank the following community members for their contributions to this release of Gradle: atm1020, mataha, Adam, Attila Kelemen, Benedikt Ritter, Björn Kautler, Caro Silva Rode, CHANHAN, Dmitry Nezavitin, Eng Zer Jun, KugelLibelle, Madalin Valceleanu, Markus Gaisbauer, Oliver Kopp, Philip Wedemann, ploober, Roberto Perez Alcolea, Rohit Anand, Suvrat Acharya, Ujwal Suresh Vanjare, Victor Merkulov
Be sure to check out the public roadmap for insight into what's planned for future releases.
Switch your build to use Gradle 9.5.0 by updating the wrapper in your project:
./gradlew wrapper --gradle-version=9.5.0 && ./gradlew wrapper
See the Gradle 9.x upgrade guide to learn about deprecations, breaking changes, and other considerations when upgrading to Gradle 9.5.0.
For Java, Groovy, Kotlin, and Android compatibility, see the full compatibility notes.
Gradle provides built-in reporting tasks to help you understand and troubleshoot your build.
When a task fails, Gradle now includes provenance information in the error message, telling you whether the task was registered by a build script, settings script, or plugin, and which one. This helps you quickly locate the source of a failing task in complex builds with many plugins and subprojects:
Execution failed for task ':app:compileJava' (registered by plugin 'org.gradle.api.plugins.JavaPlugin').
Provenance is omitted from failure messages for verification failures (e.g., test failures), since those are expected outcomes rather than configuration issues.
In addition, the outputs of some reports have been enhanced with provenance information.
When running the help task with the --task argument, task provenance information will be printed:
> ./gradlew help --task processUrl
Detailed task information for processUrl
Path
:processUrl (registered in build file 'build.gradle')
Type
UrlProcess (UrlProcess)
When running the tasks report, there is now a --provenance option available that will display the same information:
> ./gradlew tasks --provenance
Build tasks
-----------
assemble - Assembles the outputs of this project. (registered by plugin 'org.gradle.language.base.plugins.LifecycleBasePlugin')
build - Assembles and tests this project. (registered by plugin 'org.gradle.language.base.plugins.LifecycleBasePlugin')
See Task Provenance to learn more.
When Gradle finds an existing daemon but cannot use it due to JVM incompatibility, it now logs the specific reason at the INFO level:
Found daemon DaemonInfo{pid=32935, ...} however its context does not match the desired criteria.
JVM is incompatible.
Wanted: DaemonRequestContext{jvmCriteria=.../corretto-1.8.0_412/... (no Daemon JVM specified, using current Java home), ...}
Actual: DefaultDaemonContext[javaHome=.../jdk-17.0.13+11/..., javaVersion=17, javaVendor=Eclipse Adoptium, ...]
Previously, Gradle only stated that a new daemon would be used without explaining why the existing one was rejected.
This makes it easier to diagnose unexpected daemon behavior, whether using --no-daemon, investigating daemon spawns, or troubleshooting JVM compatibility issues.
Gradle provides a comprehensive plugin system, including built-in Core Plugins for standard tasks and powerful APIs for creating custom plugins.
The Gradle Wrapper now supports automatic retries when downloading the Gradle distribution. This helps reduce build failures caused by unstable network connections or temporary server issues. By default, retries are disabled to preserve existing behavior
To enable retries, add the following properties to gradle-wrapper.properties:
retries=3 # Sets the maximum number of retry attempts
retryBackOffMs=1000 # Sets the initial delay between retries (doubles on each failure)
See Configuring Wrapper Retries to learn more.
Gradle now generates type-safe Kotlin accessors for precompiled Settings plugins (*.settings.gradle.kts), matching the experience already available for project-level precompiled script plugins.
Now, type-safe accessors are generated automatically, giving you IDE autocompletion and compile-time checking:
// build-logic/src/main/kotlin/my-settings-convention.settings.gradle.kts
plugins {
id("com.gradle.develocity")
}
// Type-safe accessors, just like in project plugins
develocity {
buildScan {
publishing.onlyIf { false }
}
}
To enable these accessors, ensure your convention plugin build includes the kotlin-dsl plugin:
// build-logic/build.gradle.kts
plugins {
`kotlin-dsl`
}
Previously, when writing a precompiled script plugin for Settings, you often had to use string-based APIs to configure extensions or plugins:
// build-logic/src/main/kotlin/my-settings-convention.settings.gradle.kts
plugins {
id("com.gradle.develocity")
}
// No accessors, string-based API required
extensions.configure<com.gradle.develocity.agent.gradle.DevelocityConfiguration> {
buildScan {
publishing.onlyIf { false }
}
}
See the Gradle Kotlin DSL Primer to learn more.
The gradle init task now accepts an --into option to specify the target directory for the new project. The directory is created automatically if it doesn't exist:
gradle init --type java-application --into my-new-project
Previously, initializing a project in a new directory required creating it manually and either changing into it or using the global --project-dir flag:
mkdir my-new-project
cd my-new-project
gradle init
See Build Init Plugin to learn more.
Domain Object Collections are the typed containers Gradle uses to manage groups of related build model elements (such as tasks, configurations, source sets, and custom objects contributed by plugins). Plugin authors can now lock Domain Object Collections to prevent further modifications using the new disallowChanges() method. For example, a plugin that populates a collection during configuration can lock it to prevent other plugins from adding unexpected elements or removing existing ones. This is also useful for preventing modifications after execution has started, when changes would no longer take effect:
disallowChanges() is called, elements can no longer be added to or removed from the collection.val myCollection = objects.domainObjectContainer(MyType::class)
val main = MyType("main")
myCollection.add(main)
myCollection.add(MyType("test"))
myCollection.disallowChanges() // the collection is now immutable
main.setFoo("bar") // individual elements can still be modified
myCollection.add(MyType("other")) // this will fail
myCollection.remove(main) // this will fail
See the Javadocs to learn more.
Gradle provides rich APIs for build engineers and plugin authors, enabling the creation of custom, reusable build logic and better maintainability.
Gradle now supports the GRADLE_DAEMON_BIND_ADDRESS environment variable to explicitly specify the network address used for client-daemon and cross-daemon communication. When set, Gradle skips auto-detection entirely and uses the provided address:
GRADLE_DAEMON_BIND_ADDRESS=192.168.1.10 ./gradlew build
Previously, Gradle always attempted to auto-detect the local bind address, selecting the loopback address or falling back to the wildcard address. This could fail in environments with specific network configurations such as multiple network interfaces, multiple TCP/IP stacks, and similar setups.
See Gradle Environment Variables to learn more.
Gradle provides various incremental updates and performance optimizations to ensure the continued reliability of the build ecosystem.
Gradle users with access to a Develocity server can now generate a Build Scan without modifying their project configuration.
On the CLI, passing the following option will automatically publish a Build Scan to the passed-in Develocity server:
./gradlew --develocity-url https://develocity.example.com build
See Build Scan for details.
--help output./gradlew --help (or ./gradlew -h) now organizes CLI options into logical sections rather than listing them in a single alphabetical block. The sections are: Built-in (help, version, status, stop), Execution, Configuration, Performance, Security, Diagnostics, Logging, and Develocity.
Previously, all options were listed alphabetically with no grouping, making it hard to find related options or discover what categories of flags were available. The new layout makes it easier to scan for what you need.
See CLI Debugging to learn more.
Gradle provides Tooling APIs that facilitate deep integration with modern IDEs and CI/CD pipelines.
Tooling API clients can now access Gradle help and version information directly, the same way the Gradle CLI does. This allows IDEs and other tools to provide a more consistent user experience when interacting with Gradle.
For example, in IntelliJ IDEA, users can run --help and --version via the Execute Gradle task toolbar action.
The Isolated Projects page has been significantly revised. If you are considering adopting this experimental feature, the updated documentation provides a comprehensive overview.
The samples page has been removed. Code examples can now be found on their corresponding documentation pages, with links to the repository for full project files. For reference, you can still view the original samples page from Gradle 9.4.1.
The following course is now available: Dependency Management 1: Configurations
Known issues are problems that were discovered post-release that are directly related to changes made in this release.
We love getting contributions from the Gradle community. For information on contributing, please see gradle.org/contribute.
If you find a problem with this release, please file a bug on GitHub Issues adhering to our issue guidelines. If you're not sure if you're encountering a bug, please use the forum.
We hope you will build happiness with Gradle, and we look forward to your feedback via Twitter or on GitHub.