Creating Custom Gradle Tasks — A Practical Guide for Java Developers

Alexander Obregon
3 min readApr 14, 2023

--

Image Source

Introduction

Gradle is a powerful build automation tool that has gained popularity among Java developers for its flexibility and scalability. One of its strengths is the ability to create custom tasks that cater to specific project needs. This article will guide you through the process of creating custom Gradle tasks to optimize your Java development workflow. We’ll start with a simple example and gradually build up to more complex use cases.

Understanding Gradle Tasks

Gradle tasks represent a unit of work to be performed by the build system. These tasks can be simple, such as copying files, or more complex, like compiling and running tests. Gradle tasks can be written in either Groovy or Kotlin, but for this tutorial, we’ll use Groovy.

Setting Up a Sample Project

First, create a new directory for your project and navigate to it in your terminal:

$ mkdir custom-gradle-tasks
$ cd custom-gradle-tasks

Next, create a build.gradle file in the project directory. This is where we'll define our custom tasks.

plugins {
id 'java'
}

repositories {
mavenCentral()
}

dependencies {
testImplementation 'junit:junit:4.13.2'
}

Creating a Simple Custom Task

Let’s start with a simple custom task that prints a message. Add the following code to your build.gradle file:

task hello {
doLast {
println 'Hello, Gradle!'
}
}

Now, run the task by executing the following command in the terminal:

$ ./gradlew hello

You should see the message “Hello, Gradle!” printed to the console.

Adding Task Dependencies

Gradle tasks can depend on other tasks. In this example, we’ll create a goodbye task that depends on the hello task:

task goodbye {
dependsOn hello

doLast {
println 'Goodbye, Gradle!'
}
}

Run the goodbye task with the following command:

$ ./gradlew goodbye

You should see both messages printed to the console, with “Hello, Gradle!” appearing before “Goodbye, Gradle!”.

Creating a Custom Task with Input and Output

In this example, we’ll create a custom task that reads a file and prints its content in uppercase. First, create a file named input.txt in your project directory and add some text to it.

Add the following code to your build.gradle file:

task printUpperCase(type: JavaExec) {
main = 'com.example.PrintUpperCase'
classpath = sourceSets.main.runtimeClasspath

inputs.file 'input.txt'
outputs.upToDateWhen { false }
}

Next, create a new Java class named PrintUpperCase.java in the src/main/java/com/example directory:

package com.example;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class PrintUpperCase {
public static void main(String[] args) throws IOException {
String content = new String(Files.readAllBytes(Paths.get("input.txt")));
System.out.println(content.toUpperCase());
}
}

Run the printUpperCase task with the following command:

$ ./gradlew printUpperCase

You should see the content of the input.txt file printed in uppercase.

Conclusion

We’ve covered the basics of creating custom Gradle tasks for Java developers. We started with a simple task that printed a message, moved on to task dependencies, and finally created a task that read a file and printed its content in uppercase. Custom tasks are a powerful way to extend and tailor Gradle to your project’s specific needs, increasing productivity and streamlining the development process.

As you become more familiar with Gradle, consider exploring more advanced features such as task configuration avoidance, incremental build, and caching. These optimizations will help you get the most out of your Gradle build process and improve your Java development workflow even further.

  1. Gradle User Guide
  2. Gradle Plugin Portal
  3. Gradle Build Scans
Image Source

--

--

Alexander Obregon

Software Engineer, fervent coder & writer. Devoted to learning & assisting others. Connect on LinkedIn: https://www.linkedin.com/in/alexander-obregon-97849b229/