We are excited to announce Gradle 9.8.0 (released 2026-09-24).
In this release, Java 27 is supported for both the Gradle daemon and Java toolchains.
Gradle can now reuse Maven's mirror settings, so teams with an internal repository mirror configure it once instead of in both build tools.
Build authoring gets less verbose, with Gradle's built-in services for working with files, objects, and processes now available directly in scripts and task actions, and copy destinations configurable lazily.
For plugin authors, the Maven Publish Plugin now takes part in up-to-date checks, so it no longer regenerates a POM that has not changed. Build failures are easier to read and navigate, and more of Gradle's diagnostics are now available to tooling.
This release also includes performance improvements for Windows.
We would like to thank the following community members for their contributions to this release of Gradle: Aman Gautam, Björn Kautler, Eng Zer Jun, Hashim Khan, Julian Krannich, KBS, Labh R Jethe, Mark Dodgson, Maxim, monkey, nataphon-ktsystems, Paul King, Qiu Tian, rg_sandesh, Roberto Perez Alcolea, Sean, Zongle Wang.
Be sure to check out the public roadmap for insight into what's planned for future releases.
Switch your build to use Gradle 9.8.0 by updating the wrapper in your project:
./gradlew :wrapper --gradle-version=9.8.0 && ./gradlew :wrapper
See the Gradle 9.x upgrade guide to learn about deprecations, breaking changes, and other considerations when upgrading to Gradle 9.8.0.
For Java, Groovy, Kotlin, and Android compatibility, see the full compatibility notes.
With this release, Gradle supports Java 27.
You can now run the Gradle daemon on Java 27, in addition to using Java 27 via toolchains:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(27)
}
}
Some third-party tools (for example, PMD) do not yet support Java 27.
See the compatibility documentation for more details.
In organizations that use both Maven and Gradle build tools with an internal repository mirror, Gradle 9.8.0 supports reusing Maven's mirror repository settings with a simple flag.
By default, this is disabled, but you can enable it with org.gradle.mirror.maven.settings=true in gradle.properties.
When applying the mirror configuration, Gradle will replace a repository's URL if it matches any configured mirrors. This applies to all HTTP/HTTPS Maven repositories, including build script repositories like gradlePluginPortal(), repositories declared in settings, and repositories declared in projects. Ivy repositories, Maven local, flat directory repositories, and Maven repositories served over S3 or GCS do not support mirroring.
See the Centralizing Repositories section in the Gradle User Manual for more details.
Gradle provides an intuitive command-line interface, detailed logs, and a structured problems report that helps developers quickly identify and resolve build issues.
Two improvements make reported problems easier to scan and act on:
demo-convention.gradle.kts:8) are now clickable in terminals that support hyperlinks, so you can jump straight to the source line in most modern IDEs and editors.
In the HTML problem report, the copy button stays visible while you scroll long stack traces, so capturing a full trace no longer means hunting for the button:

Consumers of the Problems API now receive data from more parts of Gradle.
Dependency management failures are reported through the API with RFC 9457 details. Unresolved dependencies and configuration conflicts now surface as structured problems.
Configuration Cache warn-mode messages are also reported through the API, matching how Configuration Cache errors are already surfaced.
Problems raised from threads without a current build operation are now captured rather than dropped. This closes a gap where asynchronous work could silently lose its diagnostics.
Gradle provides rich APIs for build engineers and plugin authors, enabling the creation of custom, reusable build logic and better maintainability.
Copy and SyncThe Copy and Sync tasks only exposed the destination as destinationDir, a plain File property, so a destination derived from a provider had to be resolved eagerly at configuration time. Both tasks now expose a destinationDirectory DirectoryProperty:
tasks.register<Copy>("copyFiles") {
from("src")
destinationDirectory = layout.buildDirectory.dir("out")
}
The property is the single source of truth for the destination. Assigning it is equivalent to calling into(...), and it reflects whatever was configured through into(...) or destinationDir.
into(...) now wires a Provider destination into destinationDirectory instead of resolving its value, so provider-based destinations stay lazy; all other notations (String, File, Closure, Callable, ...) keep their existing lazy resolution. Since destinationDirectory is a task output property, other tasks can consume it directly and pick up the task dependency.
The new property is incubating. destinationDir continues to work and will be deprecated once destinationDirectory is promoted.
See Copy.destinationDirectory and Sync.destinationDirectory in the DSL Reference for more details.
The Groovydoc task now exposes configuration options that had previously only been available through the Groovy CLI, Ant task, or Maven plugin, closing a long-standing gap in Gradle's Groovydoc support.
Java source parsing level: Groovydoc uses JavaParser to read Java sources mixed into Groovy projects. When the parser's assumed language level is older than the sources, modern constructs — switch expressions, sealed classes, records, and similar — fail to parse, and the affected classes are silently omitted from the generated documentation. The new javaVersion property forwards the language level to Groovydoc so those sources parse cleanly:
tasks.groovydoc {
javaVersion = JavaLanguageVersion.of(21)
}
This option requires Groovy 4.0.27 or later and is silently ignored on earlier Groovy versions.
Groovy 6.0.0 documentation options: For projects using Groovy 6.0.0 or later, several new properties are now available on the Groovydoc task to control the generated output:
| Property | Purpose |
|---|---|
showInternal |
Include members annotated with groovy.transform.Internal (GEP-17). |
noIndex |
Suppress the alphabetical index page. |
noDeprecatedList |
Suppress the deprecated-list page. |
noHelp |
Suppress the help page. |
syntaxHighlighter |
Select the client-side syntax highlighter ("prism" or "none"). |
theme |
Lock the palette ("auto", "light", or "dark"). |
preLanguage |
Default language id applied to unclassified <pre> code blocks. |
additionalStylesheets |
Extra stylesheets copied alongside the default. |
All of these are silently ignored on earlier Groovy versions, so they are safe to configure in builds that may be run against multiple Groovy releases.
All new properties are incubating.
See the Groovydoc task in the DSL Reference for the full list of configuration options.
Gradle provides a comprehensive plugin system, including built-in Core Plugins for standard tasks and powerful APIs for creating custom plugins.
The GenerateMavenPom task was previously marked as untracked, so it executed on every build regardless of whether the underlying POM had changed.
The task now declares each part of its source POM as a task input, so it participates in up-to-date checks:
$ ./gradlew generatePomFileForMavenPublication
> Task :generatePomFileForMavenPublication UP-TO-DATE
BUILD SUCCESSFUL
When a withXml action is registered, task input tracking remains disabled, as withXml actions do not yet support snapshotting, so the task continues to run on every build. To restore up-to-date behavior, move the customization into the DSL properties on MavenPom where possible.
See the Generate POM task section in the Gradle User Manual for more details.
The Plugin Publish Plugin now allows plugin authors to declare support for Isolated Projects using the compatibility { features { ... } } block:
gradlePlugin {
plugins {
create("myPlugin") {
id = "io.github.my.plugin"
// ...
compatibility {
features {
isolatedProjects = true
configurationCache = true
}
}
}
}
}
Declaring compatibility with Gradle features can surface badges on the Plugin Portal and improve your plugin's search ranking.
Publishing a plugin without a compatibility declaration is deprecated as of com.gradle.plugin-publish 2.2.1 and produces a warning.
See the Declaring compatibility with Gradle features section in the Gradle User Manual for more details.
Gradle continues to reduce build times and memory usage across the daemon, configuration, and execution phases.
Builds on affected Windows machines are up to 45% faster in this release.
Gradle reads the system clock frequently while a build runs, to capture execution traces, progress events, and log messages. On most machines, this is inexpensive, but on some Windows systems, particularly virtualized ones, reading the clock is much slower, and the cost accumulates over the many readings taken during a single build.
Gradle now detects a slow system clock at startup and switches to a faster time source for the rest of the build. No configuration is required, and builds on machines with a normal system clock are unaffected.
The User Manual reference pages for the core plugins have been entirely rewritten for consistency and depth. The Core Plugin Reference index has also been reorganized and now lists previously missing core plugins.
Two new entries have been added to the Best Practices collection:
Logging.getLogger(Class) outside of Tasks — where and how to acquire a logger in build logic.Property holding a collection — the case for ListProperty and SetProperty over Property<List<...>>.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.