Gradle Release Notes

Version 7.0

The Gradle team is excited to announce a new major version of Gradle, 7.0.

This release enables file system watching by default to make your incremental builds faster, expands support for building projects with Java 16, and adds support for building on Macs using Apple Silicon processors (such as M1).

This release also introduces a feature preview for centralized dependency versions, enables build validation errors to make your builds more reliable, and makes it easier to create convention plugins for settings files. Many incubating features have been promoted to stable.

These release notes only list what's new since Gradle 6.8. You can also see the highlights of all the changes between Gradle 6.0 to 7.0.

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

Matthew Haughton, Leon Linhart, Sebastian Schuberth, Aidar Nugmanoff, Martin d'Anjou, Till Krullmann, Andreas Axelsson, Pedro Tôrres, Stefan Oehme, Jeff, Rene Groeschke, Niels Doucet, Tobias Hermann, Rishaba-Jain, Jerome Dochez, Vitaly Polonetsky, Naoki Ando, Ståle Undheim.

Table Of Contents

Upgrade instructions

Switch your build to use Gradle 7.0 by updating your wrapper:

./gradlew wrapper --gradle-version=7.0

See the Gradle upgrade guide to learn about deprecations, breaking changes and other considerations when upgrading to Gradle 7.0.

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

Performance improvements

This release contains further improvements for incremental development — the part of the software development process where you make frequent small changes.

Faster incremental builds

In an incremental build, input and output files are checked to determine what needs to be rebuilt. This feature typically saves a lot of time; however, it adds some I/O overhead, which can be noticeable in large projects when not much has changed since the previous build.

File system watching was introduced as an opt-in feature in Gradle 6.5 and marked as production-ready in Gradle 6.7. When enabled, Gradle keeps what it has learned about the file system in memory between builds and skips reading from the file system on each build. This significantly reduces the amount of disk I/O needed to determine what has changed since the previous build.

This optimization is now enabled by default on all supported platforms including recent versions of Windows, Linux, and MacOS.

See the documentation for more details.

Faster incremental changes in Android projects

This release contains performance improvements for incremental changes in Android projects, especially those that use Jettifier.

For example, assembleDebug for a non-ABI change on the Santa Tracker Android project improved by 12% compared to Gradle 6.8:

:santa-tracker:assembleDebug with non-abi change performance improvements


NOTE

File system watching and configuration caching is enabled for the comparison.


Ignore empty buildSrc project

In earlier Gradle versions, the mere presence of a buildSrc directory was enough to trigger Gradle to execute all buildSrc tasks and to add the resulting buildSrc.jar to the buildscript class path, causing an unnecessary performance overhead or cache misses.

Gradle will now ignore an empty buildSrc directory, and will only generate a buildSrc.jar if build files and/or source files are detected.

This has two benefits when an empty buildSrc directory is detected:

New features and usability improvements

Native support for Apple Silicon

Previous Gradle versions were able to run on new Macs with Apple Silicon processors with some disadvantages:

With this release, every feature is now supported using a native ARM JDK. If you're using a new Mac with Apple Silicon, you should use Gradle with a native ARM JDK for optimal performance.

Support for Java 16

Gradle now supports running on and building with Java 16.

In previous Gradle versions, running Gradle itself on Java 16 resulted in an error. JVM projects could have been built with Java 16 using toolchains but only with incremental compilation disabled.

As of Gradle 7.0, both running Gradle itself and building JVM projects with Java 16 is fully supported.

Centralized dependency versions

There are a number of ways to share dependency versions between projects in multi-project builds. For example, users can declare versions or dependency coordinates directly in build scripts (in the ext block), external files (e.g dependencies.gradle), in buildSrcor even dedicated plugins. There wasn’t, however, any standard mechanism to do this which would combine the advantages of each approach.

With this release, Gradle introduces version catalogs as an experimental feature. A version catalog enables build authors to centralize the dependency coordinates (group, artifact, version) of their third party dependencies in a conventional configuration file and declare the actual dependencies in a type-safe way.

In order to enable this experimental feature, add the following line in your settings.gradle(.kts) file:

enableFeaturePreview("VERSION_CATALOGS")

Then, you can use the gradle/libs.versions.toml file from the root of your project to declare the catalog contents:

[versions]
groovy = "3.0.5"

[libraries]
groovy-core = { module = "org.codehaus.groovy:groovy",
                version.ref = "groovy" }
groovy-json = { module = "org.codehaus.groovy:groovy-json",
                version.ref = "groovy" }
groovy-nio = { module = "org.codehaus.groovy:groovy-nio",
               version.ref = "groovy" }
commons-lang3 = { group = "org.apache.commons",
                  name = "commons-lang3",
                  version = { strictly = "[3.8,4.0[", prefer="3.9" } }

[bundles]
groovy = ["groovy-core", "groovy-json", "groovy-nio"]

After that, in any build script of any subproject, you can then use type-safe accessors to declare dependencies:

dependencies {
  implementation libs.bundles.groovy
  implementation libs.commons.lang3
}

Declaring dependencies this way allows easy reuse of dependency coordinates in all modules, provides content assist in the IDEs and reduces risk of typos. More importantly, it also provides a single location to change versions when upgrading a library.

In addition, dependencies that are frequently used together can be organized in bundles and declared in relevant projects with a single line of code. Catalogs can also be shared between different builds.

For plugin authors, or more advanced use cases, an API is available on Settings to declare version catalogs.


NOTE

This feature is aimed at centralizing declarations and has no impact on the dependency resolution process. This means that the resolved version can still be different from the ones declared in the version catalogs. For example, the resolved version of a dependency can be higher than declared in the catalog if a higher version is required by a transitive dependency.


Refer to the documentation for more details.

Type-safe project accessors

Before Gradle 7.0, the only way to declare dependencies between projects in a multi-project build was by using string notation, for example project(":some:path").

This release of Gradle adds an experimental feature for project accessors which provides type safety and enables code completion in IDEs.

In order to enable this experimental feature, add this line to your settings.gradle(.kts) file:

enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")

A project with path :client will be accessible using the following notation:

dependencies {
  // type-safe alternative to project(":client")
  implementation projects.client
}

A project with more levels of nesting like :commons:utils:numbers will be accessible using the following notation:

dependencies {
  // type-safe alternative to project(":commons:utils:numbers")
  implementation projects.commons.utils.numbers
}

Please refer to the documentation for more details.

Groovy 3 upgrade

In order to support JDK 16 and keep up to date with the latest Groovy release, Gradle has been upgraded to use Groovy 3 in Groovy DSL build scripts. Groovy 3 comes with a new parser and host of other new features and capabilities that make interoperability with new Java features easier.

There are some incompatibilities between Groovy 2 and 3, that may cause issues when upgrading to Gradle 7.0.

You may be affected by the Groovy upgrade if:

You should not be impacted by the upgrade if:

Refer to the Gradle upgrade guide to learn more about upgrading your build and plugins to be compatible with Groovy 3.

In order to learn more about the improvements and new features in Groovy 3.0, refer to the Groovy project's release notes.

Dependency locking improvements

Dependency locking is a mechanism for ensuring reproducible builds also when using dynamic dependency versions.

This release defaults to the improved dependency locking file format that results in fewer lock files in most projects that use this feature. Specifically, it results in one file per project instead of one file per configuration per project.

Gradle will automatically clean up previous lock files when migrating them over to the new file format.

In addition, when using the new format, the lock file name and location can be configured.

Using dynamic versions in the plugins block

Until now, the plugins { } block only supported fixed versions for community plugins. All version string notations Gradle supports are now accepted, including + or latest.release.

We recommend using the plugins {} block for applying plugins using Gradle 7. The old apply plugin: mechanism will be deprecated in the future.

Note that dynamic versions will introduce non-deterministic behavior to your build process and should be used judiciously. You can use dependency locking to save the set of dependencies resolved when using dynamic versions.

Build reliability improvements

Gradle employs a number of optimizations to ensure that builds are executed as fast as possible. These optimizations rely on the inputs and outputs of tasks to be well-defined. Gradle already applies some validation to tasks to check whether they are well-defined.

Disable optimizations for validation problems

If a task is failing input/output validation, Gradle will now execute it without the benefit of parallel execution, up-to-date checks and the build cache. For more information see the user manual on runtime validation.

Validate missing dependencies between tasks

One of the potential problems now flagged is a task that consumes the output produced by another without declaring an explicit or inferred task dependency. Gradle now detects the missing dependency between the consumer and the producer and emits a warning in that case. For more information see the user manual on input and output validation.

Dependency management improvements

Correct handling of libraries with standard JVM and Android variants

The Java plugins now recognizes the org.gradle.jvm.environment attribute during dependency resolution.

This allows libraries, like Guava, to clearly distinguish variants optimized for standard-jvm and android. Gradle then automatically chooses the best variant based on the current project type (Java or Android),

Plugin development improvements

Support for plugins with multiple variants

Gradle 7 looks for the new org.gradle.plugin.api-version attribute during plugin resolution. This allows plugin authors to publish different variants of their plugins for different Gradle versions. This user manual section describes how the new attribute can be used with feature variants to add additional variants to a plugin.

By default, plugins do not publish metadata with this attribute yet.

Using included builds for local plugins

Developing plugins as part of a composite build, to organize build logic in convention plugins, was so far only possible for project plugins (plugins applied in build.gradle(.kts) files). Settings plugins (plugins applied in settings.gradle(.kts) files) always had to be developed in isolation and published to a binary repository.

This release introduces a new DSL construct in the settings file for including plugin builds. Builds included like that can provide both project and settings plugins.

pluginManagement {
    includeBuild("../my-settings-plugin")
}
plugins {
    id("my.settings-plugin")
}

The above example assumes that the included build defines a settings plugin with the id my.settings-plugin.

Library components produced by builds included though the pluginManagement block are not automatically visible to the including build. However, the same build can be included as plugin build and normal library build:

pluginManagement {
    // contributes plugins
    includeBuild("../project-with-plugin-and-library")
}
// contributes libraries
includeBuild("../project-with-plugin-and-library")

This distinction reflects what Gradle offers for repository declarations - repositories are specified separately for plugin dependencies and for production dependencies.

Security advisories

This release of Gradle contains fixes for the following security advisories:

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

Java Module Support

Compiling, testing and executing Java modules is now a stable feature.

It is no longer required to activate the functionality using java.modularity.inferModulePath.set(true).

Dependency Verification

Dependency verification is promoted to a stable feature.

Java Toolchain

Java Toolchains is promoted to a stable feature.

Changing the priority of the daemon process

Changing the priority of the daemon process with --priority is now a stable feature.

In Gradle 7.0 we moved the following classes or methods out of the incubation phase.

Injectable services
  • org.gradle.api.file.ArchiveOperations
  • org.gradle.api.file.FileSystemOperations
  • org.gradle.process.ExecOperations
Configurable properties/Provider API
  • org.gradle.api.model.ObjectFactory.directoryProperty()
  • org.gradle.api.model.ObjectFactory.domainObjectContainer(Class)
  • org.gradle.api.model.ObjectFactory.domainObjectContainer(Class, NamedDomainObjectFactory)
  • org.gradle.api.model.ObjectFactory.domainObjectSet(Class)
  • org.gradle.api.model.ObjectFactory.fileCollection()
  • org.gradle.api.model.ObjectFactory.fileProperty()
  • org.gradle.api.model.ObjectFactory.fileTree()
  • org.gradle.api.model.ObjectFactory.namedDomainObjectList(Class )
  • org.gradle.api.model.ObjectFactory.namedDomainObjectSet(Class )
  • org.gradle.api.model.ObjectFactory.polymorphicDomainObjectContainer(Class )
  • org.gradle.api.model.ObjectFactory.sourceDirectorySet(String, String)
  • org.gradle.api.file.FileCollection.getElements
  • org.gradle.api.file.FileContents
  • org.gradle.api.provider.ProviderFactory.credentials(Class, String)
  • org.gradle.api.provider.ProviderFactory.credentials(Class, Provider )
  • org.gradle.api.provider.ProviderFactory.environmentVariable()
  • org.gradle.api.provider.ProviderFactory.fileContents()
  • org.gradle.api.provider.ProviderFactory.gradleProperty()
  • org.gradle.api.provider.ProviderFactory.systemProperty()
  • org.gradle.api.provider.ProviderFactory.zip(Provider, Provider, BiFunction)
  • org.gradle.api.provider.Provider.flatMap(Transformer)
  • org.gradle.api.provider.Provider.forUseAtConfigurationTime()
  • org.gradle.api.provider.Provider.orElse(T)
  • org.gradle.api.provider.Provider.orElse(org.gradle.api.provider.Provider<? extends T>)
  • org.gradle.api.provider.Provider.zip(Provider, BiFunction)
  • org.gradle.api.provider.HasConfigurableValue
  • org.gradle.api.provider.Property.value(T)
  • org.gradle.api.provider.Property.value(org.gradle.api.provider.Provider<? extends T>)
  • org.gradle.api.provider.Property.convention(T)
  • org.gradle.api.provider.Property.convention(org.gradle.api.provider.Provider<? extends T>)
  • org.gradle.api.provider.HasMultipleValues.empty
  • org.gradle.api.provider.HasMultipleValues.value(java.lang.Iterable<? extends T>)
  • org.gradle.api.provider.HasMultipleValues.value(org.gradle.api.provider.Provider<? extends java.lang.Iterable<? extends T>>)
  • org.gradle.api.provider.HasMultipleValues.convention(java.lang.Iterable<? extends T>)
  • org.gradle.api.provider.HasMultipleValues.convention(org.gradle.api.provider.Provider<? extends java.lang.Iterable<? extends T>>)
  • org.gradle.api.provider.MapProperty
  • org.gradle.api.file.FileSystemLocationProperty.getLocationOnly
  • org.gradle.api.file.FileSystemLocationProperty.fileValue
  • org.gradle.api.file.FileSystemLocationProperty.fileProvider
  • org.gradle.api.file.Directory.files
  • org.gradle.api.file.DirectoryProperty.files
Worker API
  • org.gradle.workers.ClassLoaderWorkerSpec
  • org.gradle.workers.ForkingWorkerSpec
  • org.gradle.workers.ProcessWorkerSpec
  • org.gradle.workers.WorkAction
  • org.gradle.workers.WorkParameters
  • org.gradle.workers.WorkParameters.None
  • org.gradle.workers.WorkQueue
  • org.gradle.workers.WorkerExecutor.submit(Class actionClass, Action);
  • org.gradle.workers.WorkerExecutor.classLoaderIsolation()
  • org.gradle.workers.WorkerExecutor.classLoaderIsolation(Action)
  • org.gradle.workers.WorkerExecutor.noIsolation()
  • org.gradle.workers.WorkerExecutor.noIsolation(Action)
  • org.gradle.workers.WorkerExecutor.processIsolation()
  • org.gradle.workers.WorkerExecutor.processIsolation(Action)
  • org.gradle.workers.WorkerSpec
Composite builds
  • org.gradle.api.initialization.ConfigurableIncludedBuild.setName(String)
  • org.gradle.api.tasks.GradleBuild.getBuildName()
  • org.gradle.api.tasks.GradleBuild.setBuildName(String)
Build Caching
  • org.gradle.normalization.RuntimeClasspathNormalization.metaInf(Action)
  • org.gradle.normalization.MetaInfNormalization
  • org.gradle.caching.BuildCacheKey.toByteArray
Reporting
  • org.gradle.api.reporting.Report.getOutputLocation()
  • org.gradle.api.reporting.Report.getRequired()
  • org.gradle.api.tasks.diagnostics.TaskReportTask.getDisplayGroup()
  • org.gradle.api.tasks.diagnostics.TaskReportTask.setDisplayGroup(String)
Kotlin DSL
  • org.gradle.kotlin.dsl.KotlinScript
  • org.gradle.kotlin.dsl.KotlinSettingsScript.plugins(block: PluginDependenciesSpecScope.() -> Unit): Unit
  • org.gradle.kotlin.dsl.KotlinSettingsScript.pluginManagement(block: PluginManagementSpec.() -> Unit): Unit
  • org.gradle.kotlin.dsl.ExtensionContainer.add(name: String, extension: T): Unit
  • org.gradle.kotlin.dsl.ExtensionContainer.create(name: String, vararg constructionArguments: Any): T
  • org.gradle.kotlin.dsl.ExtensionContainer.getByType(): T
  • org.gradle.kotlin.dsl.ExtensionContainer.findByType(): T?
  • org.gradle.kotlin.dsl.ExtensionContainer.configure(noinline action: T.() -> Unit)
  • org.gradle.kotlin.dsl.ArtifactHandler.invoke(configuration: ArtifactHandlerScope.() -> Unit): Unit
  • org.gradle.kotlin.dsl.ScriptHandler.dependencyLocking(configuration: DependencyLockingHandler.() -> Unit): Unit
  • org.gradle.kotlin.dsl.PluginDependenciesSpec.gradle-enterprise: PluginDependencySpec
  • org.gradle.tooling.model.kotlin.dsl.EditorPosition
  • org.gradle.tooling.model.kotlin.dsl.EditorReport
  • org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity
  • org.gradle.tooling.model.kotlin.dsl.KotlinDslModelsParameters
  • org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptModel
  • org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel
Dependency notations
  • org.gradle.api.artifacts.dsl.DependencyHandler.enforcedPlatform(java.lang.Object)
  • org.gradle.api.artifacts.dsl.DependencyHandler.enforcedPlatform(java.lang.Object, org.gradle.api.Action<? super org.gradle.api.artifacts.Dependency>)
  • org.gradle.api.artifacts.dsl.DependencyHandler.testFixtures(java.lang.Object)
  • org.gradle.api.artifacts.dsl.DependencyHandler.testFixtures(java.lang.Object, org.gradle.api.Action<? super org.gradle.api.artifacts.Dependency>)
Capabilities resolution
  • org.gradle.api.artifacts.CapabilitiesResolution
  • org.gradle.api.artifacts.CapabilityResolutionDetails
  • org.gradle.api.artifacts.ResolutionStrategy.capabilitiesResolution
  • org.gradle.api.artifacts.ResolutionStrategy.getCapabilitiesResolution
Resolution strategy tuning
  • org.gradle.api.artifacts.ResolutionStrategy.failOnDynamicVersions
  • org.gradle.api.artifacts.ResolutionStrategy.failOnChangingVersions
Dependency locking
  • org.gradle.api.artifacts.ResolutionStrategy.deactivateDependencyLocking

  • org.gradle.api.artifacts.dsl.DependencyLockingHandler.unlockAllConfigurations

  • org.gradle.api.artifacts.dsl.DependencyLockingHandler.getLockMode

  • org.gradle.api.artifacts.dsl.DependencyLockingHandler.getLockFile

  • org.gradle.api.artifacts.dsl.DependencyLockingHandler.getIgnoredDependencies

  • org.gradle.api.artifacts.dsl.LockMode

  • org.gradle.api.initialization.dsl.ScriptHandler.dependencyLocking

  • org.gradle.api.initialization.dsl.ScriptHandler.getDependencyLocking

Dependency verification
  • org.gradle.api.artifacts.ResolutionStrategy.enableDependencyVerification

  • org.gradle.api.artifacts.ResolutionStrategy.disableDependencyVerification

  • org.gradle.StartParameter.getWriteDependencyVerifications

  • org.gradle.StartParameter.setWriteDependencyVerifications

  • org.gradle.StartParameter.setDependencyVerificationMode

  • org.gradle.StartParameter.getDependencyVerificationMode

  • org.gradle.StartParameter.setRefreshKeys

  • org.gradle.StartParameter.isRefreshKeys

  • org.gradle.StartParameter.isExportKeys

  • org.gradle.StartParameter.setExportKeys

  • org.gradle.api.artifacts.verification.DependencyVerificationMode

  • Dependency constraints
  • org.gradle.api.artifacts.dsl.DependencyConstraintHandler.enforcedPlatform(java.lang.Object)

  • org.gradle.api.artifacts.dsl.DependencyConstraintHandler.enforcedPlatform(java.lang.Object, org.gradle.api.Action<? super org.gradle.api.artifacts.DependencyConstraint>)

  • org.gradle.api.artifacts.result.ComponentSelectionCause.BY_ANCESTOR

  • Component metadata rules
  • org.gradle.api.artifacts.DirectDependencyMetadata.endorseStrictVersions

  • org.gradle.api.artifacts.DirectDependencyMetadata.doNotEndorseStrictVersions

  • org.gradle.api.artifacts.DirectDependencyMetadata.isEndorsingStrictVersions

  • org.gradle.api.artifacts.DirectDependencyMetadata.getArtifactSelectors

  • org.gradle.api.artifacts.ModuleDependency.endorseStrictVersions

  • org.gradle.api.artifacts.ModuleDependency.doNotEndorseStrictVersions

  • org.gradle.api.artifacts.ModuleDependency.isEndorsingStrictVersions

  • org.gradle.api.artifacts.ComponentMetadataDetails.maybeAddVariant

  • Dependency repositories
  • org.gradle.api.artifacts.dsl.RepositoryHandler.exclusiveContent

  • org.gradle.api.artifacts.repositories.ExclusiveContentRepository

  • org.gradle.api.artifacts.repositories.InclusiveRepositoryContentDescriptor

  • org.gradle.api.artifacts.repositories.IvyArtifactRepository.getMetadataSources

  • org.gradle.api.artifacts.repositories.IvyArtifactRepository.MetadataSources.isGradleMetadataEnabled

  • org.gradle.api.artifacts.repositories.IvyArtifactRepository.MetadataSources.isIvyDescriptorEnabled

  • org.gradle.api.artifacts.repositories.IvyArtifactRepository.MetadataSources.isArtifactEnabled

  • org.gradle.api.artifacts.repositories.IvyArtifactRepository.MetadataSources.isIgnoreGradleMetadataRedirectionEnabled

  • org.gradle.api.artifacts.repositories.MavenArtifactRepository.getMetadataSources

  • org.gradle.api.artifacts.repositories.MavenArtifactRepository.MetadataSources.isGradleMetadataEnabled

  • org.gradle.api.artifacts.repositories.MavenArtifactRepository.MetadataSources.isMavenPomEnabled

  • org.gradle.api.artifacts.repositories.MavenArtifactRepository.MetadataSources.isArtifactEnabled

  • org.gradle.api.artifacts.repositories.MavenArtifactRepository.MetadataSources.isIgnoreGradleMetadataRedirectionEnabled

  • Dependency substitution
  • org.gradle.api.artifacts.ArtifactSelectionDetails

  • org.gradle.api.artifacts.DependencyArtifactSelector

  • org.gradle.api.artifacts.DependencyResolveDetails.artifactSelection

  • org.gradle.api.artifacts.DependencySubstitution.artifactSelection

  • org.gradle.api.artifacts.DependencySubstitutions.variant

  • org.gradle.api.artifacts.DependencySubstitutions.platform

  • org.gradle.api.artifacts.DependencySubstitutions.Substitution.withClassifier

  • org.gradle.api.artifacts.DependencySubstitutions.Substitution.withoutClassifier

  • org.gradle.api.artifacts.DependencySubstitutions.Substitution.withoutArtifactSelectors

  • org.gradle.api.artifacts.DependencySubstitutions.Substitution.using

  • org.gradle.api.artifacts.VariantSelectionDetails

  • Publishing
    • org.gradle.api.publish.Publication.withoutBuildIdentifier
    • org.gradle.api.publish.Publication.withBuildIdentifier
    • org.gradle.plugins.signing.SigningExtension.useInMemoryPgpKeys(String, String, String)
    • org.gradle.plugins.signing.SigningExtension.useInMemoryPgpKeys(String, String)
    • org.gradle.plugins.signing.Sign.getSignaturesByKey()
    IDE
    • org.gradle.plugins.ide.eclipse.model.ProjectDependency.getPublication()
    • org.gradle.plugins.ide.eclipse.model.ProjectDependency.setPublication(FileReference)
    • org.gradle.plugins.ide.eclipse.model.ProjectDependency.getPublicationSourcePath()
    • org.gradle.plugins.ide.eclipse.model.ProjectDependency.setPublicationSourcePath(FileReference)
    • org.gradle.plugins.ide.eclipse.model.ProjectDependency.getPublicationJavadocPath()
    • org.gradle.plugins.ide.eclipse.model.ProjectDependency.setPublicationJavadocPath(FileReference)
    • org.gradle.plugins.ide.eclipse.model.ProjectDependency.getBuildDependencies()
    • org.gradle.plugins.ide.eclipse.model.ProjectDependency.buildDependencies(Object...)
    Tooling API
    • Eclipse model
      • org.gradle.plugins.ide.eclipse.model.UnresolvedLibrary
      • org.gradle.tooling.model.eclipse.EclipseRuntime
      • org.gradle.tooling.model.eclipse.EclipseWorkspace
      • org.gradle.tooling.model.eclipse.EclipseWorkspaceProject
      • org.gradle.tooling.model.eclipse.RunClosedProjectBuildDependencies
      • org.gradle.tooling.model.eclipse.EclipseExternalDependency.isResolved()
      • org.gradle.tooling.model.eclipse.EclipseExternalDependency.getAttemptedSelector()
      • org.gradle.tooling.model.ComponentSelector
    • Testing model
      • org.gradle.tooling.events.OperationType.TestOutput
      • org.gradle.tooling.events.test.Destination
      • org.gradle.tooling.events.test.TestOutputDescriptor
      • org.gradle.tooling.events.test.TestOutputEvent
      • org.gradle.tooling.TestLauncher.withTaskAndTestClasses(String, Iterable)
      • org.gradle.tooling.TestLauncher.withTaskAndTestMethods(String, String, Iterable)
      • org.gradle.tooling.TestLauncher.debugTestsOn(int)
    • Other events
      • org.gradle.tooling.events.OperationCompletionListener
      • org.gradle.tooling.events.configuration.ProjectConfigurationProgressEvent
      • org.gradle.tooling.ProjectConnection.notifyDaemonsAboutChangedPaths
    Java Ecosystem
    • Antlr plugin
      • org.gradle.api.plugins.antlr.AntlrTask.getStableSources
      • org.gradle.api.plugins.antlr.AntlrTask.execute
    • Java plugins
      • org.gradle.api.file.SourceDirectorySet.getDestinationDirectory()
      • org.gradle.api.file.SourceDirectorySet.getClassesDirectory()
      • org.gradle.api.file.SourceDirectorySet.compiledBy(TaskProvider , Function<T, DirectoryProperty>)
      • org.gradle.api.tasks.compile.AbstractCompile.getDestinationDirectory()
      • org.gradle.api.plugins.FeatureSpec.withJavadocJar()
      • org.gradle.api.plugins.FeatureSpec.withSourcesJar()
      • org.gradle.api.plugins.JavaBasePlugin.COMPILE_CLASSPATH_PACKAGING_SYSTEM_PROPERTY
      • org.gradle.api.plugins.JvmEcosystemPlugin
      • org.gradle.api.plugins.JavaPluginExtension.withJavadocJar()
      • org.gradle.api.plugins.JavaPluginExtension.withSourcesJar()
      • org.gradle.api.tasks.JavaExec.getExecutionResult()
      • org.gradle.api.tasks.SourceSet.getCompileOnlyApiConfigurationName()
      • org.gradle.api.tasks.SourceSet.getJavadocElementsConfigurationName()
      • org.gradle.api.tasks.SourceSet.getJavadocJarTaskName()
      • org.gradle.api.tasks.SourceSet.getJavadocTaskName()
      • org.gradle.api.tasks.SourceSet.getSourcesElementsConfigurationName()
      • org.gradle.api.tasks.SourceSet.getSourcesJarTaskName()
      • org.gradle.api.tasks.SourceSetOutput.getGeneratedSourcesDirs()
      • org.gradle.api.tasks.compile.CompileOptions.getGeneratedSourceOutputDirectory()
      • org.gradle.api.tasks.compile.CompileOptions.getRelease()
      • org.gradle.api.tasks.compile.JavaCompile.getStableSources()
      • org.gradle.api.tasks.compile.JavaCompile.getSourceClassesMappingFile()
      • org.gradle.api.tasks.compile.JavaCompile.compile(org.gradle.work.InputChanges)
    • Java Module System
      • org.gradle.api.jvm.ModularitySpec
      • org.gradle.api.plugins.JavaApplication.getMainModule()
      • org.gradle.api.plugins.JavaPluginExtension.getModularity()
      • org.gradle.api.tasks.compile.JavaCompile.getModularity()
      • org.gradle.api.tasks.compile.CompileOptions.getJavaModuleMainClass()
      • org.gradle.api.tasks.compile.CompileOptions.getJavaModuleVersion()
      • org.gradle.api.tasks.javadoc.Javadoc.getModularity()
      • org.gradle.external.javadoc.MinimalJavadocOptions.getModulePath()
      • org.gradle.external.javadoc.MinimalJavadocOptions.setModulePath()
      • org.gradle.external.javadoc.MinimalJavadocOptions.modulePath()
      • org.gradle.jvm.application.scripts.JavaAppStartScriptGenerationDetails.getModulePath()
      • org.gradle.jvm.application.tasks.CreateStartScripts.getMainClass()
      • org.gradle.jvm.application.tasks.CreateStartScripts.getMainModule()
      • org.gradle.jvm.application.tasks.CreateStartScripts.getModularity()
      • org.gradle.process.JavaExecSpec.getMainClass()
      • org.gradle.process.JavaExecSpec.getMainModule()
      • org.gradle.process.JavaExecSpec.getModularity()
    • Java Toolchains
      • org.gradle.api.tasks.JavaExec.getJavaLauncher()
      • org.gradle.api.tasks.compile.JavaCompile.getJavaCompiler()
      • org.gradle.api.tasks.javadoc.Javadoc.getJavadocTool()
      • org.gradle.api.tasks.testing.Test.getJavaLauncher()
      • org.gradle.jvm.toolchain.JavaCompiler
      • org.gradle.jvm.toolchain.JavaInstallationMetadata
      • org.gradle.jvm.toolchain.JavaLanguageVersion
      • org.gradle.jvm.toolchain.JavaLauncher
      • org.gradle.jvm.toolchain.JavaToolchainService
      • org.gradle.jvm.toolchain.JavaToolchainSpec
      • org.gradle.jvm.toolchain.JavadocTool
      • org.gradle.jvm.toolchain.JvmImplementation
      • org.gradle.jvm.toolchain.JvmVendorSpec
      • org.gradle.api.plugins.JavaPluginExtension.toolchain(action)
      • org.gradle.api.plugins.JavaPluginExtension.getToolchain()
      • org.gradle.api.tasks.compile.GroovyCompile.getJavaLauncher()
    • Testing
      • org.gradle.api.plugins.JavaTestFixturesPlugin
      • org.gradle.api.tasks.testing.JUnitXmlReport.getMergeReruns()
      • org.gradle.api.tasks.testing.Test.getStableClasspath()
      • org.gradle.api.tasks.testing.TestDescriptor.getDisplayName()
      • org.gradle.api.tasks.testing.TestFilter.excludeTestsMatching(String)
      • org.gradle.api.tasks.testing.TestFilter.excludeTest(String, String)
      • org.gradle.api.tasks.testing.TestFilter.getExcludePatterns()
      • org.gradle.api.tasks.testing.TestFilter.setExcludePatterns()
      • org.gradle.testing.jacoco.tasks.JacocoReport.getReportProjectName()
    • Groovy
      • org.gradle.api.tasks.compile.GroovyCompile.getAstTransformationClasspath()
      • org.gradle.api.tasks.compile.GroovyCompile.getSourceClassesMappingFile()
      • org.gradle.api.tasks.compile.GroovyCompileOptions.isParameters()
      • org.gradle.api.tasks.compile.GroovyCompileOptions.setParameters(boolean)
      • org.gradle.api.tasks.compile.GroovyCompile.getStableSources
    • Scala
      • org.gradle.api.plugins.scala.ScalaBasePlugin.SCALA_COMPILER_PLUGINS_CONFIGURATION_NAME
      • org.gradle.api.plugins.scala.ScalaPluginExtension
      • org.gradle.api.tasks.scala.ScalaCompile.getScalaCompilerPlugins()
      • org.gradle.api.tasks.scala.ScalaCompile.setScalaCompilerPlugins(FileCollection)
      • org.gradle.api.tasks.scala.ScalaDoc.getMaxMemory()
      • org.gradle.api.tasks.scala.IncrementalCompileOptions.getClassfileBackupDir()
    • Miscellaneous
      • org.gradle.api.plugins.quality.CodeNarc.getCompilationClasspath()
      • org.gradle.api.plugins.quality.CodeNarc.setCompilationClasspath(FileCollection)
      • org.gradle.api.plugins.quality.Pmd.getIncrementalAnalysis()
      • org.gradle.api.plugins.quality.Pmd.getIncrementalCacheFile()
      • org.gradle.api.plugins.quality.Pmd.getMaxFailures()
      • org.gradle.api.plugins.quality.PmdExtension.getMaxFailures()
      • org.gradle.plugins.ear.Ear.getGenerateDeploymentDescriptor()
      • org.gradle.plugins.ear.EarPluginConvention.getGenerateDeploymentDescriptor()
      • org.gradle.api.distribution.Distribution.getDistributionBaseName()
    Other APIs
    • org.gradle.buildinit.tasks.InitBuild.getSplitProject()
    • org.gradle.api.Generated
    • org.gradle.api.JavaVersion.VERSION_15
    • org.gradle.api.JavaVersion.VERSION_16
    • org.gradle.api.JavaVersion.VERSION_17
    • org.gradle.api.JavaVersion.isJava12
    • org.gradle.api.JavaVersion.isJava12Compatible
    • org.gradle.api.JavaVersion.isCompatibleWith
    • org.gradle.api.ProjectConfigurationException
    • org.gradle.api.invocation.BuildInvocationDetails
    • org.gradle.api.invocation.Gradle.beforeSettings(Action)
    • org.gradle.api.invocation.Gradle.beforeSettings(Closure)
    • org.gradle.api.logging.WarningMode.Fail
    • org.gradle.api.reflect.TypeOf.getConcreteClass()
    • org.gradle.api.resources.TextResourceFactory.fromInsecureUri(Object)
    • org.gradle.api.tasks.AbstractExecTask.getExecutionResult()
    • org.gradle.plugin.management.PluginManagementSpec.getPlugins()
    • org.gradle.plugin.management.PluginManagementSpec.plugins(Action)
    • org.gradle.testkit.runner.GradleRunner.getEnvironment()
    • org.gradle.testkit.runner.GradleRunner.withEnvironment(Map<String, String>)
    • org.gradle.api.reflect.InjectionPointQualifier
    • org.gradle.api.file.FileType
    • org.gradle.api.model.ReplacedBy
    • org.gradle.api.Task.getTimeout
    • org.gradle.process.JavaDebugOptions
    • org.gradle.process.JavaForkOptions.getDebugOptions()
    • org.gradle.process.JavaForkOptions.debugOptions(Action)
    • org.gradle.api.tasks.WorkResult.or
    • org.gradle.api.tasks.IgnoreEmptyDirectories
    • org.gradle.api.tasks.TaskInputFilePropertyBuilder.ignoreEmptyDirectories()
    • org.gradle.api.tasks.TaskInputFilePropertyBuilder.ignoreEmptyDirectories(boolean)
    • org.gradle.normalization.PropertiesFileNormalization
    • org.gradle.normalization.RuntimeClasspathNormalization.properties(java.lang.String, org.gradle.api.Action<? super org.gradle.normalization.PropertiesFileNormalization>)
    • org.gradle.normalization.RuntimeClasspathNormalization.properties(org.gradle.api.Action<? super org.gradle.normalization.PropertiesFileNormalization>)
    • org.gradle.api.file.DuplicatesStrategy.INHERIT
    • org.gradle.api.artifacts.result.ResolutionResult.getRequestedAttributes
    • org.gradle.api.artifacts.result.ResolvedComponentResult.getDependenciesForVariant
    • org.gradle.api.artifacts.result.ResolvedDependencyResult.getResolvedVariant
    • org.gradle.api.artifacts.ComponentVariantIdentifier
    • org.gradle.api.artifacts.maven.PomModuleDescriptor
    • org.gradle.api.artifacts.repositories.AuthenticationSupported.credentials(java.lang.Class<? extends org.gradle.api.credentials.Credentials>)
    • org.gradle.jvm.JvmLibrary
    • org.gradle.language.base.artifact.SourcesArtifact
    • org.gradle.language.java.artifact.JavadocArtifact
    • org.gradle.plugin.devel.tasks.ValidatePlugins

    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 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.