O Maven organiza a construção de um projeto num ciclo de vida (lifecycle): uma sequência ordenada de fases. Quando pede uma fase, o Maven executa todas as fases anteriores pela ordem.
É o princípio mais importante a reter:
Pedir uma fase executa automaticamente todas as que a precedem.
mvn packagelança portanto tambémvalidate,compileetest.
O Maven possui na realidade três ciclos de vida:
| Ciclo de vida | Papel |
|---|---|
| default | Construir o projeto (compile, test, package…) |
| clean | Limpar (eliminar target/) |
| site | Gerar a documentação do projeto |
# Executar uma fase = executar tudo até ela
mvn package # lança validate -> compile -> test -> package🔧 Mini-exercício — Quais fases se executam quando lança mvn package? Liste-as pela ordem.
validate → compile → test → package: pedir uma fase executa automaticamente todas as que a precedem.
O ciclo de vida default tem muitas fases; eis as mais usadas no dia a dia:
| Fase | O que faz |
|---|---|
validate | Verifica que o projeto está correto e que toda a informação necessária está presente |
compile | Compila o código-fonte (src/main/java) |
test | Executa os testes unitários |
package | Empacota o código compilado (.jar ou .war) |
verify | Lança os testes de integração e os controlos de qualidade |
install | Instala o artefacto no repositório local ~/.m2 |
deploy | Publica o artefacto num repositório remoto partilhado |
mvn validate # verificações de base
mvn compile # + compilação
mvn test # + testes unitários
mvn package # + criação do artefacto
mvn verify # + testes de integração
mvn install # + cópia para ~/.m2
mvn deploy # + publicação remotaQuanto mais se avança na lista, mais o Maven faz.
mvn installé o « canivete suíço » do desenvolvimento local: constrói tudo e torna o artefacto disponível para os seus outros projetos na mesma máquina.
A fase compile transforma o seu código Java (src/main/java) em bytecode (.class) colocado em target/classes. É o plugin Compiler que se encarrega disso, usando o javac do JDK.
A versão de Java usada é definida pelas propriedades vistas na lição 02:
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties># Compilar o código principal
mvn compile
# Compilar também o código de teste
mvn test-compile🔧 Mini-exercício — Em que pasta o bytecode .class do código principal é depositado após mvn compile?
Em target/classes (por exemplo target/classes/com/exemple/App.class).
| Propriedade | Papel |
|---|---|
maven.compiler.source | Versão da linguagem Java aceite no código |
maven.compiler.target | Versão do bytecode gerado |
Resultado em target/:
target/
└── classes/
└── com/exemple/App.class <-- bytecode compiladoSe a compilação falhar (
BUILD FAILURE), o Maven para imediatamente: as fases seguintes (test,package) não se executam. Corrigem-se sempre primeiro os erros de compilação.
A fase test executa os testes unitários situados em src/test/java. É o plugin Surefire que os lança, geralmente com o framework JUnit.
Um teste JUnit típico:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class CalculTest {
@Test
void additionDeDeuxNombres() {
assertEquals(4, 2 + 2);
}
}# Executar todos os testes
mvn test
# Executar uma só classe de teste
mvn test -Dtest=CalculTest
# Construir SALTANDO os testes (a evitar, salvo caso preciso)
mvn package -DskipTests🔧 Mini-exercício — Escreva o comando Maven que empacota o projeto sem lançar os testes.
mvn package -DskipTests| Elemento | Papel |
|---|---|
| JUnit | O framework que define e verifica os testes |
| Surefire | O plugin Maven que executa os testes unitários |
| Failsafe | O plugin que executa os testes de integração (fase verify) |
⚠️ Se um só teste falhar, o build inteiro falha (
BUILD FAILURE) e opackagenão é produzido. É intencional: não se entrega um artefacto cujos testes não passam. Saltar os testes com-DskipTestsdeve permanecer excecional.
A fase package junta o código compilado num artefacto entregável, depositado em target/. O tipo de artefacto depende da etiqueta <packaging> do pom.xml.
| Packaging | Artefacto | Uso |
|---|---|---|
jar | .jar | Biblioteca ou aplicação Java autónoma |
war | .war | Aplicação web implantada num servidor (Tomcat…) |
pom | (nenhum) | Projeto pai/agregador, sem código |
<!-- Escolha do tipo de artefacto -->
<packaging>jar</packaging># Produzir o artefacto
mvn package
# Localizar o resultado
ls target/Resultado:
target/
├── classes/
├── mon-app-1.0.0-SNAPSHOT.jar <-- o artefacto entregável
└── ...O nome do artefacto segue o padrão
artifactId-version.packaging. Exemplo:mon-app-1.0.0-SNAPSHOT.jar. É este ficheiro que se distribui ou implanta.
Após package, três operações completam o ciclo de vida.
| Comando | Efeito |
|---|---|
mvn install | Constrói + copia o artefacto para ~/.m2 (reutilizável localmente) |
mvn deploy | Constrói + publica o artefacto num repositório remoto (Nexus/Artifactory) |
mvn clean | Elimina a pasta target/ (recomeça do zero) |
A combinação clean install é uma das mais frequentes: garante um build totalmente limpo.
# Recomeçar do zero e construir tudo até à instalação local
mvn clean install
# Construir e publicar no repositório remoto da equipa
mvn clean deploy| Fase | Quem precisa dela? |
|---|---|
install | Programador que quer reutilizar o artefacto noutro projeto local |
deploy | Equipa / CI que publica uma versão para toda a gente |
clean | Quem quer evitar resíduos de um build anterior |
mvn clean installé o reflexo a adotar quando « já não funciona sem razão »: ocleanelimina ficheiros compilados eventualmente obsoletos emtarget/.
🔧 Mini-exercício — Escreva o comando que recomeça de um target/ limpo e depois instala o artefacto no repositório local ~/.m2.
mvn clean installO que acontece quando lança mvn package?
a) Só a fase package se executa
b) O Maven executa também todas as fases anteriores (validate, compile, test)
c) O Maven publica o artefacto num repositório remoto
d) O Maven elimina a pasta target/
✅ Resposta: b) — Pedir uma fase executa todas as fases anteriores pela ordem: validate → compile → test → package.
Que plugin Maven executa os testes unitários?
a) Compiler
b) Surefire
c) Shade
d) Jar
✅ Resposta: b) — O plugin Surefire executa os testes unitários (com JUnit) durante a fase test.
O que faz a fase install?
a) Instala o Maven na máquina
b) Copia o artefacto para o repositório local ~/.m2
c) Publica no Maven Central
d) Elimina target/
✅ Resposta: b) — install copia o artefacto para ~/.m2, tornando-o reutilizável por outros projetos locais.
Que etiqueta determina se o projeto produz um .jar ou um .war?
a) <scope>
b) <version>
c) <packaging>
d) <artifactId>
✅ Resposta: c) — <packaging>jar</packaging> ou <packaging>war</packaging> fixa o tipo de artefacto produzido por package.
O que acontece durante mvn package se um teste unitário falhar?
a) O artefacto é mesmo assim produzido
b) O build falha (BUILD FAILURE) e o artefacto não é produzido
c) O Maven ignora o teste
d) O Maven passa diretamente a deploy
✅ Resposta: b) — Um teste em falha interrompe o build; o package não é criado. É intencional: não se entrega um artefacto cujos testes falham.
Num projeto Maven, percorra o ciclo de vida passo a passo: limpe, compile, teste, empacote e depois instale localmente. Observe em cada etapa o que o Maven produz em target/.
# 1. Recomeçar do zero: elimina target/
mvn clean
# 2. Compilar: produz target/classes
mvn compile
ls target/classes # bytecode .class presente
# 3. Testar: o Surefire executa os testes JUnit
mvn test
# 4. Empacotar: produz o .jar em target/
mvn package
ls target/*.jar # mon-app-1.0.0-SNAPSHOT.jar
# 5. Instalar no repositório local ~/.m2
mvn install
# Variante condensada mais frequente:
mvn clean installResultado esperado:
[INFO] --- compiler:compile --- (target/classes criado)
[INFO] --- surefire:test --- Tests run: 1, Failures: 0, Errors: 0
[INFO] --- jar:jar --- Building jar: target/mon-app-1.0.0-SNAPSHOT.jar
[INFO] --- install:install --- Installing ... to ~/.m2/repository/...
[INFO] BUILD SUCCESSObserve a ordem das linhas
[INFO]:compile, depoistest, depoisjar, depoisinstall. É a prova visível de que o Maven encadeia automaticamente as fases pela ordem do ciclo de vida.
validate → compile → test → package → verify → install → deploy.compile (plugin Compiler) produz o bytecode em target/classes.test (plugin Surefire + JUnit) executa os testes; uma falha interrompe o build.package cria o .jar/.war; install copia-o para ~/.m2; clean esvazia target/.Domina agora o Maven: estrutura, pom.xml, dependências e ciclo de vida. O módulo 04 abordará a contentorização com Docker, onde empacotará estes artefactos Maven em imagens portáteis.
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