Gradle Release Notes

We are excited to announce Gradle 9.3.0-20251023001628+0000 (released 2025-10-23).

This release features 1, 2, ... n, and more.

We would like to thank the following community members for their contributions to this release of Gradle:

Be sure to check out the public roadmap for insight into what's planned for future releases.

Table Of Contents

Upgrade instructions

Switch your build to use Gradle 9.3.0-20251023001628+0000 by updating the wrapper in your project:

./gradlew wrapper --gradle-version=9.3.0-20251023001628+0000 && ./gradlew wrapper

See the Gradle 9.x upgrade guide to learn about deprecations, breaking changes, and other considerations when upgrading to Gradle 9.3.0-20251023001628+0000.

For Java, Groovy, Kotlin, and Android compatibility, see the full compatibility notes.

New features and usability improvements

Build authoring improvements

New AttributeContainer.named() method

This release introduces a new convenience method on AttributeContainer, named(), which can create attribute values directly from the container without requiring a separate ObjectFactory instance.

This method makes attribute assignment more concise while preserving the same semantics as creating a named value via ObjectFactory:

configurations.resolvable("foo") {
    attributes {
        // Before: 
        attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, "red"))
        
        // After:
        attribute(Usage.USAGE_ATTRIBUTE, named(Usage::class.java, "red"))
    }
}

Stream TestKit output

Gradle TestKit's BuildResult now offers a new method for accessing the build console output efficiently, especially for builds that produce a large volume of logs.

BuildResult.getOutput() returns a String with the full build console output. This can use large amounts of memory for builds with extensive logs.

A new BuildResult.getOutputReader() method is available, returning a BufferedReader for streaming the build output incrementally. This can help reduce memory pressure in TestKit tests.

Please ensure you close the BufferedReader after use; we recommend the standard Java try-with-resources pattern for this:

void testProject() {
    BuildResult buildResult = GradleRunner.create()
        .withProjectDir(File("test-project"))
        .withArguments(":build", "--info")
        .build();

    try (BufferedReader outputReader = buildResult.getOutputReader()) {
        List<String> logLines = outputReader.lines()
            .filter(line -> line.contains("example build message"))
            .collect(Collectors.toList());
        // do something with the log lines...
    }
}

Promoted features are features that were incubating in previous versions of Gradle but are now supported and subject to backward compatibility. See the User Manual section on the "Feature Lifecycle" for more information.

The following are the features that have been promoted in this Gradle release.

Fixed issues

Known issues

Known issues are problems that were discovered post-release that are directly related to changes made in this release.

External contributions

We love getting contributions from the Gradle community. For information on contributing, please see gradle.org/contribute.

Reporting problems

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.