Ciclo de vida e fases

8 min

Índice


1 — O ciclo de vida de build

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 package lança portanto também validate, compile e test.

O Maven possui na realidade três ciclos de vida:

Ciclo de vidaPapel
defaultConstruir o projeto (compile, test, package…)
cleanLimpar (eliminar target/)
siteGerar a documentação do projeto
bash
# 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.

✅ Ver uma solução

validatecompiletestpackage: pedir uma fase executa automaticamente todas as que a precedem.

↑ Voltar ao topo


2 — As fases principais

O ciclo de vida default tem muitas fases; eis as mais usadas no dia a dia:

FaseO que faz
validateVerifica que o projeto está correto e que toda a informação necessária está presente
compileCompila o código-fonte (src/main/java)
testExecuta os testes unitários
packageEmpacota o código compilado (.jar ou .war)
verifyLança os testes de integração e os controlos de qualidade
installInstala o artefacto no repositório local ~/.m2
deployPublica o artefacto num repositório remoto partilhado
bash
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 remota

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

↑ Voltar ao topo


3 — Compilação

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:

xml
<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>
bash
# 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?

✅ Ver uma solução

Em target/classes (por exemplo target/classes/com/exemple/App.class).

PropriedadePapel
maven.compiler.sourceVersão da linguagem Java aceite no código
maven.compiler.targetVersão do bytecode gerado

Resultado em target/:

target/
└── classes/
    └── com/exemple/App.class   <-- bytecode compilado

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

↑ Voltar ao topo


4 — Os testes (JUnit + Surefire)

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:

java
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class CalculTest {
    @Test
    void additionDeDeuxNombres() {
        assertEquals(4, 2 + 2);
    }
}
bash
# 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.

✅ Ver uma solução
bash
mvn package -DskipTests
ElementoPapel
JUnitO framework que define e verifica os testes
SurefireO plugin Maven que executa os testes unitários
FailsafeO plugin que executa os testes de integração (fase verify)

⚠️ Se um só teste falhar, o build inteiro falha (BUILD FAILURE) e o package não é produzido. É intencional: não se entrega um artefacto cujos testes não passam. Saltar os testes com -DskipTests deve permanecer excecional.

↑ Voltar ao topo


5 — O packaging (jar / war)

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.

PackagingArtefactoUso
jar.jarBiblioteca ou aplicação Java autónoma
war.warAplicação web implantada num servidor (Tomcat…)
pom(nenhum)Projeto pai/agregador, sem código
xml
<!-- Escolha do tipo de artefacto -->
<packaging>jar</packaging>
bash
# 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.

↑ Voltar ao topo


6 — Install, deploy e clean

Após package, três operações completam o ciclo de vida.

ComandoEfeito
mvn installConstrói + copia o artefacto para ~/.m2 (reutilizável localmente)
mvn deployConstrói + publica o artefacto num repositório remoto (Nexus/Artifactory)
mvn cleanElimina a pasta target/ (recomeça do zero)

A combinação clean install é uma das mais frequentes: garante um build totalmente limpo.

bash
# 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
FaseQuem precisa dela?
installProgramador que quer reutilizar o artefacto noutro projeto local
deployEquipa / CI que publica uma versão para toda a gente
cleanQuem quer evitar resíduos de um build anterior

mvn clean install é o reflexo a adotar quando « já não funciona sem razão »: o clean elimina ficheiros compilados eventualmente obsoletos em target/.

🔧 Mini-exercício — Escreva o comando que recomeça de um target/ limpo e depois instala o artefacto no repositório local ~/.m2.

✅ Ver uma solução
bash
mvn clean install

↑ Voltar ao topo


7 — Quiz — Ciclo de vida e fases

Question 1

O 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/

💡 Ver a solução

Resposta: b) — Pedir uma fase executa todas as fases anteriores pela ordem: validatecompiletestpackage.


Question 2

Que plugin Maven executa os testes unitários?

a) Compiler

b) Surefire

c) Shade

d) Jar

💡 Ver a solução

Resposta: b) — O plugin Surefire executa os testes unitários (com JUnit) durante a fase test.


Question 3

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/

💡 Ver a solução

Resposta: b)install copia o artefacto para ~/.m2, tornando-o reutilizável por outros projetos locais.


Question 4

Que etiqueta determina se o projeto produz um .jar ou um .war?

a) <scope>

b) <version>

c) <packaging>

d) <artifactId>

💡 Ver a solução

Resposta: c)<packaging>jar</packaging> ou <packaging>war</packaging> fixa o tipo de artefacto produzido por package.


Question 5

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

💡 Ver a solução

Resposta: b) — Um teste em falha interrompe o build; o package não é criado. É intencional: não se entrega um artefacto cujos testes falham.

↑ Voltar ao topo


8 — Prática — Percorrer o ciclo de vida

Instrução

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


Correção — Sequência de comandos esperada

bash
# 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 install

Resultado 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 SUCCESS

Observe a ordem das linhas [INFO]: compile, depois test, depois jar, depois install. É a prova visível de que o Maven encadeia automaticamente as fases pela ordem do ciclo de vida.

↑ Voltar ao topo


9 — Síntese

Pontos a reter

  1. O ciclo de vida é uma sequência ordenada de fases; pedir uma fase executa todas as anteriores.
  2. Fases-chave: validatecompiletestpackageverifyinstalldeploy.
  3. compile (plugin Compiler) produz o bytecode em target/classes.
  4. test (plugin Surefire + JUnit) executa os testes; uma falha interrompe o build.
  5. package cria o .jar/.war; install copia-o para ~/.m2; clean esvazia target/.

A continuação

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.

↑ 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