Introdução ao Maven

8 min

Índice


1 — O que é o Maven?

O Apache Maven é uma ferramenta de automatização de construção (build automation) para projetos Java. Toma o seu código-fonte e produz um entregável (um ficheiro .jar ou .war) ao orquestrar todas as etapas: compilação, testes, empacotamento, gestão das dependências.

Concretamente, o Maven responde a três necessidades fundamentais:

NecessidadeO que o Maven faz
Construir o projetoCompila o código e produz um artefacto (.jar, .war)
Gerir as dependênciasDescarrega automaticamente as bibliotecas necessárias
PadronizarImpõe uma estrutura de projeto idêntica em todo o lado

O coração do Maven é um ficheiro único, o pom.xml (Project Object Model), que descreve o projeto: a sua identidade, as suas dependências e a forma de o construir. É a « receita » que o Maven executa.

Sem Maven, construir um projeto Java significa compilar à mão com javac, descarregar cada biblioteca manualmente e gerir sozinho o classpath. O Maven automatiza tudo isto a partir de um só ficheiro.

🔧 Mini-exercício — Cite as três necessidades fundamentais a que o Maven responde.

✅ Ver uma solução

Construir o projeto (compilar + produzir um artefacto .jar/.war), gerir as dependências (descarregar as bibliotecas) e padronizar (impor uma estrutura de projeto idêntica).

↑ Voltar ao topo


2 — O problema que o Maven resolve

Antes do Maven, cada projeto Java era construído « à mão » ou com scripts caseiros. Isto colocava vários problemas recorrentes:

Problema (sem Maven)Solução (com Maven)
Encontrar e descarregar os .jar um a umDeclaração no pom.xml, descarregamento automático
Conflitos de versões de bibliotecasResolução transitiva automática
« Compila em mim mas não em ti »Build reproduzível e padronizado
Cada projeto arrumado de forma diferenteEstrutura de pastas imposta

A ideia mestra: um programador que entra num projeto Maven sabe imediatamente onde está o código, onde estão os testes e como lançar a construção — independentemente da empresa ou do projeto.

bash
# Com Maven, construir um projeto desconhecido resume-se a:
mvn package

O Maven transforma « como construir este projeto? » — uma pergunta que por vezes levava horas — num único comando universal.

🔧 Mini-exercício — Escreva o único comando que basta para construir um projeto Maven desconhecido.

✅ Ver uma solução
bash
mvn package

↑ Voltar ao topo


3 — Convenção em vez de configuração

O princípio central do Maven é « convenção em vez de configuração » (convention over configuration). Em vez de descrever tudo explicitamente, o Maven parte de valores por omissão sensatos. Se respeitar as convenções, quase não tem nada a configurar.

Exemplos de convenções por omissão:

ElementoLocalização esperada por omissão
Código-fonte principalsrc/main/java
Recursos principaissrc/main/resources
Código de testesrc/test/java
Artefacto produzidotarget/

Comparemos as filosofias:

AbordagemConsequência
Configurar tudoFlexível mas verbosa, sujeita a erros
Convenção por omissãoConcisa, coerente entre projetos, rápida a arrancar

Pode sempre redefinir as convenções se necessário, mas 95 % dos projetos contentam-se com os valores por omissão. Menos configuração = menos bugs.

↑ Voltar ao topo


4 — Estrutura padrão de um projeto Maven

Todo o projeto Maven segue a mesma árvore. Conhecê-la permite navegar instantaneamente em qualquer projeto.

Detalhe das pastas:

CaminhoPapel
pom.xmlA receita do projeto (na raiz)
src/main/javaO código-fonte da aplicação
src/main/resourcesFicheiros não-Java (.properties, .xml, imagens)
src/test/javaAs classes de testes unitários
src/test/resourcesRecursos usados pelos testes
target/Pasta de saída: classes compiladas e artefacto final

🔧 Mini-exercício — Em que pasta deve colocar uma classe de teste unitário, e em qual um ficheiro application.properties?

✅ Ver uma solução

O teste unitário vai para src/test/java, e application.properties para src/main/resources.

bash
# Árvore típica vista na linha de comandos
mon-projet/
├── pom.xml
├── src/
   ├── main/
   ├── java/        # ex. com/exemple/App.java
   └── resources/   # ex. application.properties
   └── test/
       └── java/        # ex. com/exemple/AppTest.java
└── target/              # gerado: não versionar (.gitignore)

⚠️ A pasta target/ é regenerada em cada build. Acrescente-a ao .gitignore: nunca se versionam artefactos compilados.

↑ Voltar ao topo


5 — Instalar o Maven

O Maven precisa de um JDK (Java Development Kit) já instalado, porque se apoia no compilador javac. A variável JAVA_HOME deve apontar para esse JDK.

Consoante o seu sistema:

SistemaComando de instalação
Windows (com Chocolatey)choco install maven
macOS (com Homebrew)brew install maven
Linux (Debian/Ubuntu)sudo apt install maven

Instalação manual (todas as plataformas):

bash
# 1. Verificar primeiro que o Java está presente
java -version
# Deve mostrar uma versão 17+ por exemplo

# 2. Definir JAVA_HOME (exemplo Linux/macOS)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk

# 3. Descarregar o Maven em maven.apache.org, descomprimir,
#    depois acrescentar a pasta bin/ ao PATH
export PATH=$PATH:/opt/apache-maven-3.9.6/bin

No Windows, JAVA_HOME regula-se em « Variáveis de ambiente ». No Linux/macOS, acrescente a linha export ao seu ~/.bashrc ou ~/.zshrc para que seja permanente.

↑ Voltar ao topo


6 — Verificar a instalação e primeiro projeto

Com o Maven instalado, verifica-se que funciona e gera-se um primeiro esqueleto de projeto.

bash
# Verificar a versão instalada
mvn -version

Saída típica:

Apache Maven 3.9.6
Maven home: /opt/apache-maven-3.9.6
Java version: 17.0.9, vendor: Eclipse Adoptium

Para gerar um projeto vazio que respeita as convenções, usa-se um arquétipo (um modelo):

bash
# Gera um projeto « quickstart » padrão
mvn archetype:generate \
  -DgroupId=com.exemple \
  -DartifactId=mon-app \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DinteractiveMode=false
ComandoEfeito
mvn -versionMostra a versão do Maven e do Java
mvn archetype:generateGera um projeto a partir de um modelo
mvn packageConstrói o artefacto em target/

O primeiro mvn é lento: o Maven descarrega os seus próprios plugins num cache local (~/.m2/repository). Os builds seguintes são muito mais rápidos.

🔧 Mini-exercício — Escreva o comando que mostra a versão do Maven instalada (e a do Java).

✅ Ver uma solução
bash
mvn -version

↑ Voltar ao topo


7 — Quiz — Introdução ao Maven

Question 1

O que designa o ficheiro pom.xml num projeto Maven?

a) O código-fonte principal da aplicação

b) O Project Object Model: a receita que descreve o projeto e o seu build

c) O resultado compilado do projeto

d) Um ficheiro de logs

💡 Ver a solução

Resposta: b) — O pom.xml (Project Object Model) descreve a identidade do projeto, as suas dependências e a forma de o construir.


Question 2

Onde o Maven espera encontrar o código-fonte principal por omissão?

a) code/

b) target/main

c) src/main/java

d) java/source

💡 Ver a solução

Resposta: c) — Por convenção, o código principal vai para src/main/java e os testes para src/test/java.


Question 3

O que significa « convenção em vez de configuração »?

a) É preciso configurar tudo explicitamente

b) O Maven usa valores por omissão sensatos, reduzindo a configuração necessária

c) Nunca se pode mudar o comportamento do Maven

d) O Maven não tem ficheiro de configuração

💡 Ver a solução

Resposta: b) — Ao respeitar as convenções por omissão, o pom.xml permanece mínimo. Pode sempre redefinir uma convenção se necessário.


Question 4

Que pasta é gerada automaticamente pelo Maven e não deve ser versionada?

a) src/main/java

b) src/test/java

c) target/

d) resources/

💡 Ver a solução

Resposta: c)target/ contém as classes compiladas e o artefacto; é regenerada em cada build e deve figurar no .gitignore.


Question 5

De que precisa o Maven para funcionar?

a) De um servidor web

b) De um JDK instalado e de JAVA_HOME configurado

c) De uma base de dados

d) De Node.js

💡 Ver a solução

Resposta: b) — O Maven apoia-se no compilador javac do JDK; JAVA_HOME deve apontar para esse JDK.

↑ Voltar ao topo


8 — Prática — Criar e inspecionar um projeto

Instrução

Verifique a sua instalação do Maven, gere um projeto « quickstart » chamado mon-app no grupo com.exemple, depois construa-o e localize o artefacto produzido.


Correção — Sequência de comandos esperada

bash
# 1. Verificar Maven e Java
mvn -version

# 2. Gerar o projeto a partir do arquétipo quickstart
mvn archetype:generate \
  -DgroupId=com.exemple \
  -DartifactId=mon-app \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DinteractiveMode=false

# 3. Entrar no projeto e inspecionar a estrutura
cd mon-app
ls -R          # ou « tree » se disponível

# 4. Construir o projeto
mvn package

# 5. Localizar o artefacto gerado
ls target/

Resultado esperado:

target/
├── classes/
├── mon-app-1.0-SNAPSHOT.jar   <-- o artefacto produzido
└── ...
BUILD SUCCESS

A árvore gerada deve conter:

mon-app/
├── pom.xml
└── src/
    ├── main/java/com/exemple/App.java
    └── test/java/com/exemple/AppTest.java

Se mvn package mostrar BUILD SUCCESS e um .jar aparecer em target/, a sua cadeia Maven está operacional. O sufixo -SNAPSHOT indica uma versão em desenvolvimento (ver lição 02).

↑ Voltar ao topo


9 — Síntese

Pontos a reter

  1. O Maven é uma ferramenta de automatização de build para Java: compila, testa, empacota e gere as dependências.
  2. O pom.xml é a receita única que descreve o projeto e o seu build.
  3. Convenção em vez de configuração: valores por omissão minimizam o que tem de escrever.
  4. Estrutura padrão: src/main/java, src/test/java, src/main/resources, saída em target/.
  5. O Maven exige um JDK e JAVA_HOME; verifica-se com mvn -version.

A continuação

Lição 02 — O ficheiro pom.xml: dissecar em detalhe a receita do Maven — coordenadas do projeto, propriedades e herança parent.

↑ Voltar ao topo


Todos os direitos reservados. Qualquer reprodução, difusão, utilização ou adaptação deste curso, no todo ou em parte, é estritamente proibida sem a autorização escrita prévia do Dr. Haythem REHOUMA.

Curso criado por Dr. Haythem REHOUMA — Desenvolvimento e implementação de soluções de dados