Gradle Build Tool Features
This categorized list of Gradle Build Tool features will help you understand some capabilities of Gradle Build Tool for your use cases. Check out the User Guide for reference and Gradle Build Tool Tutorials for getting started.
Table of Contents
-
Running Gradle Builds
-
Authoring Gradle Builds
-
Ecosystem-specific Features
-
Features for Developer Tool Providers
Running Gradle Builds
These features affect developers running Gradle builds, and can be taken advantage of by anyone running Gradle.
Performance
Incremental Builds
Gradle checks between builds whether the input, output, or an implementation of a task has changed since the last build invocation. If not, the task is considered up-to-date and does not need to be executed. Gradle also considers the configuration of the task as part of its input.
Build Caching
If a task has already been executed on another computer, Gradle can skip the execution locally and instead load the task's outputs from the build cache. The typical use case is to let CI builds push to a shared build cache and allow developers to pull from it. A local build cache is also available to reuse task outputs produced earlier on the same machine.
Incremental Tasks
When Gradle discovers that the input or output of a task has changed between build runs, the task is executed again. The task can use the incremental API to learn what files exactly have changed. With this information, the task may not need to rebuild everything.
Incremental Annotation Processing
Incremental annotation processing significantly increases the effectiveness of incremental compilation when supported annotation processors are present.
Compiler Daemon
When you need to fork the compilation process, Gradle creates a daemon process that is reused within a multi-project build. This provides a dramatic speed improvement for the compilation process.
Parallel Execution
Gradle allows parallel execution of tasks and intra-task work through a Worker API. Parallelism is very fine-grained, resulting in faster performance.
Parallel Download of Dependencies
Gradle will download dependency metadata (typically `pom.xml`) and artifacts in parallel. This is done on demand only when the artifacts are required.
Task Timeouts
Every task has a timeout property that can be used to limit its execution time. When a task reaches its timeout, its task execution thread is interrupted, allowing the build to finish.
Build Scans
Web-based Build Visualization
Understand what happened in your build via a rich web interface instead of a text console and text files. Build scans provide more information and are more effective.
Collaborative Debugging
Share build scans with colleagues to solve problems efficiently and improve things together. Share entire scans or links focused on a particular build aspect, such as a logging output line.
Extend and Customize
Add your own data to build scans as tags, values, and links. Integrate build scans into your toolchain.
Fine-grained Build Comparison [Develocity]
Build scan comparison quickly highlights differences between builds, such as dependencies and their versions, making root cause analysis much faster.
Track and Export History Across all Builds [Develocity]
Track key build metrics for all your builds, including local development builds and not just CI builds. Understand trends and export build scan data to the storage of your choosing.
Execution Options
Continuous build
When a Gradle task is run in continuous mode, Gradle automatically watches for changes in the input of this task. Whenever the input changes, the task is automatically executed. You can run multiple tasks continuously in a multi-project build.
Composite builds
Composite builds allow you to include other independent projects so that you can, for instance, develop an application and a library that it depends on simultaneously. They build in parallel by default and can be nested.
Task Exclusion
You can exclude any task from being run. When you exclude a task, all tasks this task depends on are also automatically excluded if they have no other dependencies.
Dry Run
Run a build to see which tasks actually get executed without executing the task actions.
Continue Execution After Failures
Builds do not stop when the first failure is encountered. This enables discovering as many failures as possible in a single build execution with a very nice aggregated error report at the end.
Fail Fast Test execution
Although continuing after a test failure is the default in Gradle, you can set the `--fail-fast` flag or configure `failFast=true` for a Gradle build to fail and finish as soon as one of your tests fails.
Sync Dependency Cache with Repository
Gradle has a `--refresh-dependencies` option to ignore all cached entries for resolved modules and artifacts. A fresh resolve will be performed against all configured repositories, with dynamic versions recalculated, modules refreshed, and artifacts downloaded. However, Gradle will check if the previously downloaded artifacts are valid before downloading them again. This is done by comparing published SHA1 values in the repository with the SHA1 values for existing downloaded artifacts.
Ecosystem-specific Features
Features specific to JVM, Android, C++, Swift, Objective C, and other ecosystems.
JVM Applications
Incremental Compilation for Java
Whether the source code or the classpath changes, Gradle detects all classes affected by the change and will only recompile those.
Compile Avoidance for Java
If a dependent project has changed in an ABI-compatible way (only its private API has changed), Java compilation tasks will be up-to-date.
Built-in Groovy Support
The Groovy plugin extends the Java plugin to add support for Groovy projects. It can deal with Groovy code, mixed Groovy and Java code, and even pure Java code.
Built-in Scala Support
The Scala plugin extends the Java plugin to add support for Scala projects. It can deal with Scala code, mixed Scala and Java code, and even pure Java code.
Built-in Support for JVM Code Quality Tools
The Gradle distribution includes plugins for Checkstyle, CodeNarc, PMD, JaCoCo, and other tools.
Packaging and Distribution for JARs, WARs, and EARs
Gradle comes out-of-the-box with tools to package JVM-based code into common archive files.
Publishing to Maven Repositories
Publish artifacts to Maven repositories like Bintray or Maven Central.
Publishing to Ivy Repositories
Publish artifacts to Ivy repositories with customizable directory layouts.
Ant Integration
You can deeply integrate any default, optional, or custom Ant task. You can also import Ant builds at runtime and even partially replace Ant targets dependent on Gradle tasks.
Android Applications
Official Android Build Tool
The Gradle Android Plugin and Android Studio are official tools provided and maintained by the Android SDK Tools team. To learn more about using Gradle with Android, please reference the Android Developer Documentation for Gradle.
Native Applications
Build C/C++/Obj-C/Obj-C++/Assembler
Gradle has built-in support for compiling and linking programs using Assembler, C/C++, and Obj-C/C++. Gradle can build shared and static libraries and executables.
Model variants of a native component
Easily model variants of a native component like support for different ABI's, OS, build types, etc.
GCC Support
Gradle supports building with GCC4 on Linux, Windows (with Cygwin and MingW), and Mac OS X.
Clang Support
Gradle supports building with Clang on Linux and Mac OS X.
MS Visual C++ Support
Gradle supports building with Microsoft's Visual C++ compiler on Windows. (VS 2010, VS 2013, and VS 2015 supported)
Generates Windows Resources
Gradle uses Microsoft's resource compiler to build Windows resource script files into your application.
Parallel Compilation
When building native code, Gradle divides the compilation step into parallelizable tasks and executes them in a shared resource pool. This speeds up the single project case and ensures that Gradle does not consume too many resources in parallel multi-project builds.
Precompiled Headers
Gradle makes it easy to use precompiled headers when building your software. Precompiled headers can speed up compilation times if your project has many header files included in most of your source code. Precompiled headers are a compiler-specific optimization to cache an already parsed version of your headers.
Build mixed language binaries
Gradle can build separate languages (e.g., Assembler and C) and link them into a single executable or library.
CUnit Test Support
Gradle supports testing C applications with CUnit.
GoogleTest Support
Gradle supports testing C++ applications with GoogleTest.
Cached Compilation
When building native code, Gradle uses the build cache to avoid recompiling code that hasn't changed. Compiler arguments, macro definitions, and headers are all considered when reusing cached compilation.
Features for Developer Tool Providers
These features will be most interesting for those working on IDEs and continuous integration systems, but there are many other creative uses.
Embed Gradle with Tooling API
SDK for embedded usage
Provided by the Gradle Tooling API
Version agnostic
The Gradle tooling API is backward and forward-compatible. With a particular version of the Tooling API you can drive build across all Gradle versions since 1.0.
Querying for Project model
You can query Gradle for the details of a build, including the project hierarchy, project dependencies, external dependencies (including source and Javadoc jars), source directories, and tasks in each project.
Query for Build environment information
Gradle provides programmatic access to information about the build environment. This includes information about the Gradle Version, The Gradle User Home directory, and the Java Home directory.
Execute a build
You can execute a build and listen to stdout and stderr logging and progress (e.g., the stuff shown in the 'status bar' when you run on the command line).
Build Operation Cancellation
All operations initiated via the Gradle Tooling API are gracefully cancellable at any time during the build
Support custom JVM settings
JVM args provided via the Gradle Tooling API take precedence over gradle.properties
Provide Eclipse Project Model
The Gradle Tooling API provides a model of how your project is mapped to an Eclipse project.
Provide IDEA Project Model
The Gradle Tooling API provides a model of how your project is mapped to the IDEA model.
Provide support for custom Project Model
You can write a Gradle plugin to add custom metadata for the Gradle Tooling API. You can use this, for example, when you integrate your own product/customizations with Gradle.
Run specific tests
The TestLauncher API allows running specific JUnit or TestNG Tests within one or more Test Tasks
Register for progress events
Register for events of task or test progress to get informed about the process of the build with rich information about the processed task and test
Run Continuous Builds
Gradle Tooling API provides the functionality to run a build programmatically in "continuous build" mode. Changes in build inputs (File changes) continuously trigger specified tasks to run.
Customizable Logging
Custom Logging Schemas
You can replace much of Gradle’s logging UI with your own. You might do this, for example, if you want to customize the UI in some way, e.g., to log more or less information or to change the formatting.
Redirecting Output from Other Tools
The build output is very important for the build user experience. Integrating with external tools and libraries might make the console output very verbose. In Gradle System.out, the log output of Java Util Logging, Jakarta Commons Logging, and Log4j is re-routed to the Gradle logging system. You can route and define the log level on a per-tool basis.