Introdução ao Maven para Java
O que é Maven, como ele compila projetos Java e como instalar e executar comandos mvn.
Maven é a ferramenta padrão de automação de build e gerenciamento de dependências para Java. Ele transforma um projeto em uma descrição declarativa — o que ele é, do que depende, como é construído — e executa o build por você. Em vez de gerenciar manualmente arquivos JAR e flags do javac, você declara suas necessidades em um único arquivo e o Maven baixa as dependências, compila, testa e empacota seu código por meio de um ciclo de vida previsível e reproduzível.
O POM: um projeto como dados
Todo projeto Maven é descrito por um pom.xml (Project Object Model). Ele identifica o projeto com três coordenadas — groupId, artifactId e version (juntas chamadas de "GAV") — e lista as bibliotecas necessárias. O mesmo esquema de coordenadas nomeia seu projeto e cada dependência, e é assim que o Maven localiza os artefatos em um repositório.
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>shop-app</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.release>21</maven.compiler.release>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>6.1.0</version>
</dependency>
</dependencies>
</project>O elemento <packaging> informa ao Maven o que produzir (jar, war, pom). O bloco <properties> contém valores reutilizáveis — aqui, a versão Java que o compilador tem como alvo. O POM cresce para cobrir plugins, perfis e herança; o capítulo Maven POM detalha essas partes.
Dependências e o classpath transitivo
Você lista apenas suas dependências diretas. O Maven lê o próprio POM de cada dependência e inclui tudo o que elas precisam — as dependências transitivas — construindo o classpath completo automaticamente. Declarar spring-web também traz spring-core sem que você precise nomeá-lo.
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>Cada dependência tem um escopo que controla quando ela está no classpath. O padrão, compile, a disponibiliza em todo lugar; test a limita ao código de teste; provided significa que o runtime a fornece. Para conflitos de versão, exclusões e dependencyManagement, consulte dependências do Maven.
| Escopo | No classpath de compilação | No classpath de teste | Empacotado | Uso típico |
|---|---|---|---|---|
compile (padrão) | Sim | Sim | Sim | Bibliotecas comuns |
provided | Sim | Sim | Não | API Servlet, fornecida em runtime |
runtime | Não | Sim | Sim | Drivers JDBC |
test | Não | Sim | Não | JUnit, Mockito |
O ciclo de vida do build
Os builds do Maven percorrem uma sequência fixa de fases. As principais fases do ciclo de vida padrão são validate, compile, test, package, verify, install e deploy. Executar uma fase executa todas as fases anteriores — mvn package primeiro valida, compila e testa, depois empacota. Você nunca chama fases fora de ordem.
mvn compile # compile main sources
mvn test # compile + run unit tests
mvn package # compile + test + build the JAR/WAR
mvn install # package + copy artifact into your local repository
mvn clean package # delete target/ first, then build freshCada fase está vinculada a um ou mais objetivos fornecidos por plugins (por exemplo, compiler:compile está vinculado à fase compile). Os plugins são onde o trabalho real acontece; o ciclo de vida apenas ordena esse trabalho. O capítulo ciclo de vida do build Maven percorre todos os três ciclos de vida integrados e como os objetivos se vinculam às fases.
Repositórios
O Maven busca artefatos em repositórios. Ao fazer o build, ele procura primeiro no seu repositório local (~/.m2/repository), um cache na sua máquina. Se não encontrar, ele baixa de um repositório remoto — por padrão o Maven Central — e armazena uma cópia localmente para que o próximo build seja rápido mesmo offline. As equipes frequentemente adicionam um repositório privado para bibliotecas internas.
project pom.xml → local repo (~/.m2) → remote repo (Maven Central)
(cache hit?) (download + cache)Um exemplo executável
O executor de código não tem Maven em seu classpath, portanto o programa abaixo modela a mecânica central do Maven com código puro do JDK: ele armazena um POM simples como um mapa, resolve o fechamento de dependências transitivas (eliminando duplicatas de artefatos compartilhados) e percorre o ciclo de vida do build, parando na fase solicitada. As formas aqui — coordenadas GAV, resolução transitiva, fases ordenadas — são exatamente o que o Maven real faz.
O que observar na execução:
- O projeto e cada dependência são nomeados pela mesma tripla GAV, razão pela qual
Project coordinates: com.example:shop-app:1.0.0se parece com uma linha de dependência. - Apenas duas dependências são declaradas, mas o classpath resolvido tem quatro JARs —
spring-coreejackson-annotationsforam incluídos transitivamente, exatamente como o Maven faz. - O conjunto
seengarante que cada artefato apareça apenas uma vez; esta é a deduplicação do Maven que impede que uma biblioteca compartilhada apareça no classpath duas vezes. Executing: mvn packageexecutavalidate,compileetestantes depackagee então para — executar uma fase sempre executa todas as fases anteriores em ordem.- O build para em
packagee nunca chega ainstall, refletindo como o objetivo solicitado limita até onde o ciclo de vida avança.
Quando usar o Maven
O Maven se destaca em projetos Java e JVM convencionais: seus padrões de "convenção sobre configuração" (código-fonte em src/main/java, testes em src/test/java, saída em target/) significam que um novo colaborador pode compilar qualquer projeto Maven da mesma forma. Seu XML declarativo é fácil de ler e fazer diff, e o suporte a IDEs é maduro. A contrapartida é a verbosidade e a flexibilidade limitada para builds incomuns. Quando você precisa de builds com scripts e altamente personalizados, o Gradle é a alternativa comum — ele usa um script de build programável em vez de XML declarativo, mas cobre o mesmo terreno: coordenadas GAV, dependências transitivas e um grafo de tarefas (em vez de fases).
Próximos passos
- Maven POM — a estrutura completa do
pom.xml, incluindo plugins e herança. - Dependências do Maven — escopos, exclusões e resolução de conflitos de versão em profundidade.
- Ciclo de vida do build Maven — cada fase, os três ciclos de vida e como vincular objetivos.
- Introdução ao Gradle — a alternativa baseada em scripts ao Maven.