W3docs

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:

AspectoMavenGradle
Arquivo de buildpom.xml (XML)build.gradle (Groovy) ou build.gradle.kts (Kotlin)
ModeloFases do ciclo de vida fixasGrafo de tarefas configurável (um DAG)
ExtensibilidadePlugins, vinculados às fasesPlugins e tarefas ad-hoc escritas inline
Builds incrementaisLimitadoNativo: verificações up-to-date + cache de build
Wrapperopcionalgradlew é o padrão — fixa a versão do Gradle
VerbosidadeMais boilerplateConciso, 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 tarefacompileJava, 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 tree

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

java— editable, runs on the server

O que extrair da execução:

  • O build declara 7 tarefas, mas você nunca especifica uma ordem manualmente — você solicita build e 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 compileJava e processResources primeiro, depois classes, jar, compileTestJava, test e, 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 precedem build.
  • classes é alcançado por dois caminhos (via jar e via test), mas aparece uma vez na ordem — o conjunto done garante 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; apenas jar, compileTestJava, test e build mostram (EXEC). Este é o build incremental do Gradle: tarefas cujas entradas não mudaram são ignoradas.
  • A linha final reporta 4 of 7 tarefas executadas. Ignorar o trabalho não alterado é exatamente o motivo pelo qual um segundo gradle 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.

Prática

Prática
Quando você executa 'gradle build', como o Gradle decide a ordem em que tarefas como compileJava, test e jar são executadas?
Quando você executa 'gradle build', como o Gradle decide a ordem em que tarefas como compileJava, test e jar são executadas?
Was this page helpful?