In Gradle, we can apply plugins to our project. A plugin basically adds extra functionalities such as tasks and properties to our project. By using a plugin, functionality is decoupled from the core Gradle build logic. We can write our own plugins, but Gradle also ships with plugins that are ready out of the box. For example, Gradle has a Java plugin. This plugin adds tasks for compiling, testing, and packaging Java source code to our project.
The plugins that are packaged with a Gradle version are never updated or changed for this version, so if a new functionality is added to a plugin, a whole new Gradle version will be released. In the future versions of Gradle, this will change. This doesn't apply for the plugins that we write ourselves. We can release new versions of our own plugins, independent of the Gradle version. Let's start with the Java plugin that is a part of the Gradle distribution.