W3docs

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.

EscopoNo classpath de compilaçãoNo classpath de testeEmpacotadoUso típico
compile (padrão)SimSimSimBibliotecas comuns
providedSimSimNãoAPI Servlet, fornecida em runtime
runtimeNãoSimSimDrivers JDBC
testNãoSimNãoJUnit, 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 fresh

Cada 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.

java— editable, runs on the server

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.0 se parece com uma linha de dependência.
  • Apenas duas dependências são declaradas, mas o classpath resolvido tem quatro JARs — spring-core e jackson-annotations foram incluídos transitivamente, exatamente como o Maven faz.
  • O conjunto seen garante 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 package executa validate, compile e test antes de package e então para — executar uma fase sempre executa todas as fases anteriores em ordem.
  • O build para em package e nunca chega a install, 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

Prática

Prática
No Maven, o que acontece quando você executa 'mvn package'?
No Maven, o que acontece quando você executa 'mvn package'?
Was this page helpful?