Introdução ao Gradle em Java
O que é o Gradle, como ele se compara ao Maven e como configurar um projeto Java com Gradle.
Gradle é uma ferramenta de automação de build para a JVM (e além) que compila seu código, executa seus testes, gerencia suas dependências e empacota o resultado — tudo controlado por um script de build que você escreve em Groovy ou Kotlin. Onde o Maven descreve um projeto com XML fixo, o Gradle o descreve com código: um script de build que configura um grafo de tarefas. Essa mudança para um modelo programável, aliada a um cache de build incremental que ignora o trabalho já realizado, é o motivo pelo qual o Gradle potencializa o Android e muitos projetos Java de grande porte.
Gradle vs. Maven
Ambas as ferramentas resolvem o mesmo problema — builds repetíveis com dependências gerenciadas —, mas fazem escolhas diferentes. Se você já conhece o Maven, este é o mapeamento:
| Aspecto | Maven | Gradle |
|---|---|---|
| Arquivo de build | pom.xml (XML) | build.gradle (Groovy) ou build.gradle.kts (Kotlin) |
| Modelo | Fases do ciclo de vida fixas | Grafo de tarefas configurável (um DAG) |
| Extensibilidade | Plugins, vinculados às fases | Plugins e tarefas ad-hoc escritas inline |
| Builds incrementais | Limitado | Nativo: verificações up-to-date + cache de build |
| Wrapper | opcional | gradlew é o padrão — fixa a versão do Gradle |
| Verbosidade | Mais boilerplate | Conciso, mas mais "mágica" para aprender |
Nenhum é estritamente melhor. A rigidez do Maven torna os builds previsíveis; a flexibilidade do Gradle torna builds complexos expressáveis. Esta parte ensina Gradle; a introdução ao Maven cobre o outro lado.
Um script de build Java mínimo
Um projeto Java com Gradle é composto por um build.gradle e um layout de código-fonte convencional (src/main/java, src/test/java). Aplicar o plugin embutido java é o que ensina ao Gradle como compilar, testar e gerar o jar:
plugins {
id 'java'
}
group = 'com.example'
version = '1.0.0'
repositories {
mavenCentral()
}
dependencies {
implementation 'com.google.guava:guava:33.0.0-jre'
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
}O DSL Kotlin (build.gradle.kts) expressa a mesma coisa com acessores type-safe:
plugins {
java
}
dependencies {
implementation("com.google.guava:guava:33.0.0-jre")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
}As tarefas são a unidade de trabalho
Tudo o que o Gradle faz é uma tarefa — compileJava, test, jar, build. As tarefas declaram dependências em outras tarefas, formando um grafo acíclico dirigido (DAG). Quando você executa gradle build, o Gradle percorre esse grafo e executa cada pré-requisito exatamente uma vez, em ordem. Você também pode definir as suas próprias:
task hello {
doLast {
println 'Hello from a custom Gradle task'
}
}
task release {
dependsOn 'build', 'hello'
}O plugin java monta um grafo padrão para você: classes depende de compileJava e processResources; jar depende de classes; test depende de classes e compileTestJava; e build depende de jar e test. Solicitar build executa todas elas na ordem de dependência.
O wrapper e a linha de comando
O Gradle Wrapper (gradlew / gradlew.bat) é um script versionado no repositório que baixa e executa a versão exata do Gradle que o projeto espera, para que os colaboradores não precisem ter o Gradle instalado globalmente:
./gradlew build # compile, test, and package
./gradlew test # run tests only
./gradlew clean build # wipe outputs, then rebuild from scratch
./gradlew tasks # list available tasks
./gradlew dependencies # print the resolved dependency treeUsar ./gradlew em vez do gradle do sistema é o padrão recomendado — torna o build reproduzível entre máquinas e em ambientes de CI.
Um exemplo prático: um grafo de tarefas, resolvido como o Gradle faz
Não há Gradle no executor desta página, portanto, em vez de um build real, modelamos o motor central do Gradle em Java puro: um grafo de tarefas com dependências, resolvido em uma ordem de execução com uma ordenação topológica — exatamente o que o Gradle faz quando você digita gradle build. A segunda passagem mostra como tarefas up-to-date são ignoradas, que é o truque de build incremental do Gradle.
O que extrair da execução:
- O build declara 7 tarefas, mas você nunca especifica uma ordem manualmente — você solicita
builde o grafo calcula o restante. Essa inversão (declare dependências, deixe a ferramenta ordená-las) é o coração do modelo de tarefas do Gradle. - A ordem resolvida imprime
compileJavaeprocessResourcesprimeiro, depoisclasses,jar,compileTestJava,teste, por fim,build. Uma tarefa só é executada após todas as tarefas das quais depende, razão pela qual a compilação precede o empacotamento e os testes precedembuild. classesé alcançado por dois caminhos (viajare viatest), mas aparece uma vez na ordem — o conjuntodonegarante que cada tarefa seja executada uma única vez, assim como o Gradle nunca recompila as mesmas fontes duas vezes em uma invocação.- Na segunda execução, as três tarefas marcadas como up-to-date exibem
(UP-TO-DATE)e não são contadas; apenasjar,compileTestJava,testebuildmostram(EXEC). Este é o build incremental do Gradle: tarefas cujas entradas não mudaram são ignoradas. - A linha final reporta
4 of 7tarefas executadas. Ignorar o trabalho não alterado é exatamente o motivo pelo qual um segundogradle buildé muito mais rápido que o primeiro, e por que o cache de build importa em projetos grandes.
O que o restante desta parte cobre
Escrever scripts build.gradle reais, declarar e resolver dependências do Maven Central, aplicar e configurar plugins, definir tarefas personalizadas e usar o wrapper em CI. O próximo capítulo, Construindo um projeto Java com Gradle, configura um projeto Java completo com Gradle a partir de um diretório vazio.