O arquivo pom.xml

7 min

Índice


1 — O pom.xml, coração do projeto

O pom.xml (Project Object Model) é o ficheiro central de todo o projeto Maven. É um documento XML que descreve o projeto: a sua identidade, as suas dependências, as suas propriedades e a forma de o construir.

Todo o pom.xml começa por uma raiz <project> com o seu espaço de nomes e declara obrigatoriamente a versão do modelo:

xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <!-- O resto da configuração aqui -->

</project>

<modelVersion>4.0.0</modelVersion> é obrigatório e vale sempre 4.0.0 hoje: é a versão do formato de ficheiro pom.xml, não a versão do seu projeto.

↑ Voltar ao topo


2 — Estrutura geral do pom.xml

Um pom.xml lê-se de cima para baixo, por grandes blocos. Eis a organização típica:

BlocoPapel
<modelVersion>Versão do formato (sempre 4.0.0)
<groupId> / <artifactId> / <version>Coordenadas (identidade do projeto)
<packaging>Tipo de artefacto (jar, war, pom)
<properties>Variáveis reutilizáveis (versões, encoding)
<dependencies>As bibliotecas usadas (lição 03)
<build>Plugins e configuração de construção

O bloco <packaging> determina o tipo de entregável:

ValorProduto
jarBiblioteca ou aplicação Java (omissão)
warAplicação web implantável num servidor
pomProjeto « parent » sem código (agregador)

Se omitir <packaging>, o Maven escolhe jar por omissão. Mais uma vez: convenção em vez de configuração.

🔧 Mini-exercício — Escreva a etiqueta <packaging> para produzir uma aplicação web implantável no Tomcat.

✅ Ver uma solução
xml
<packaging>war</packaging>

↑ Voltar ao topo


3 — As coordenadas do projeto (GAV)

Todo o projeto Maven é identificado de forma única por três coordenadas, muitas vezes abreviadas GAV: GroupId, ArtifactId, Version.

xml
<groupId>com.exemple</groupId>
<artifactId>mon-app</artifactId>
<version>1.0.0</version>
CoordenadaSignificadoConvenção
groupIdA organização / o projetoNome de domínio invertido: com.exemple
artifactIdO nome do móduloCurto, em minúsculas: mon-app
versionA versão correnteNumérica: 1.0.0, ou 1.0.0-SNAPSHOT

O sufixo -SNAPSHOT merece atenção especial:

VersãoSentido
1.0.0-SNAPSHOTVersão em desenvolvimento, instável, atualizada com frequência
1.0.0Versão publicada (release), congelada e imutável
bash
# O nome do artefacto produzido combina artifactId + version
# Ex : mon-app-1.0.0-SNAPSHOT.jar
mvn package

A combinação groupId:artifactId:version é o « endereço postal » do seu projeto no ecossistema Maven. É assim que outros projetos poderão depender dele.

🔧 Mini-exercício — Escreva as três etiquetas GAV para um projeto com.banque chamado gestion-comptes em versão de desenvolvimento 1.0.0.

✅ Ver uma solução
xml
<groupId>com.banque</groupId>
<artifactId>gestion-comptes</artifactId>
<version>1.0.0-SNAPSHOT</version>

↑ Voltar ao topo


4 — As propriedades

O bloco <properties> define variáveis reutilizáveis em todo o pom.xml. Aí se centralizam as versões e os ajustes para evitar repetições.

xml
<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit.version>5.10.2</junit.version>
</properties>

Reutiliza-se depois uma propriedade com a sintaxe ${nom}:

xml
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>${junit.version}</version>   <!-- reutiliza a propriedade -->
    <scope>test</scope>
</dependency>

Propriedades habituais:

PropriedadePapel
maven.compiler.source / targetVersão Java do código-fonte e do bytecode
project.build.sourceEncodingEncoding dos ficheiros (sempre UTF-8)
Propriedades personalizadas (junit.version…)Centralizar os números de versão

Centralizar as versões em <properties> é uma boa prática: para passar o JUnit de 5.10 a 5.11, modifica um só sítio em vez de cada dependência.

🔧 Mini-exercício — Defina uma propriedade gson.version com o valor 2.10.1 e mostre como a reutilizar numa etiqueta <version>.

✅ Ver uma solução
xml
<properties>
    <gson.version>2.10.1</gson.version>
</properties>
<!-- ... -->
<version>${gson.version}</version>

↑ Voltar ao topo


5 — A herança parent

Um pom.xml pode herdar de outro pom.xml via o bloco <parent>. O filho recupera então as propriedades, dependências e configurações do parent. É o mecanismo que permite fatorizar a configuração comum a vários módulos.

xml
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.5</version>
    <relativePath/>   <!-- vazio: ir buscar o parent no repositório -->
</parent>

O uso mais conhecido é o parent Spring Boot, que fixa as versões de dezenas de bibliotecas para que sejam compatíveis entre si. Graças a ele, declara dependências sem precisar a versão:

xml
<!-- Sem <version>: é herdada do parent -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
Com herança parentSem herança parent
Versões coerentes garantidasRisco de versões incompatíveis
Menos configuração repetidaTudo a redeclarar em cada módulo

O parent Spring Boot age como uma « lista de compras validada »: garante que todas as suas bibliotecas se entendem, sem que tenha de escolher cada número de versão à mão.

↑ Voltar ao topo


6 — Um pom.xml completo comentado

Eis um pom.xml realista que reúne tudo o que precede: coordenadas, propriedades, parent opcional e dependências.

xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <!-- Versão do formato de ficheiro -->
    <modelVersion>4.0.0</modelVersion>

    <!-- Coordenadas GAV: identidade do projeto -->
    <groupId>com.exemple</groupId>
    <artifactId>mon-app</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <!-- Variáveis reutilizáveis -->
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>5.10.2</junit.version>
    </properties>

    <!-- Bibliotecas usadas -->
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

Pode mostrar-se o pom.xml « efetivo » (com toda a herança resolvida):

bash
# Mostra o pom completo, parent incluído
mvn help:effective-pom

O comando mvn help:effective-pom é precioso para compreender o que o Maven « vê » realmente, incluindo tudo o que vem do parent.

🔧 Mini-exercício — Escreva o comando que mostra o pom.xml efetivo, com toda a herança do parent resolvida.

✅ Ver uma solução
bash
mvn help:effective-pom

↑ Voltar ao topo


7 — Quiz — O ficheiro pom.xml

Question 1

O que valem as três coordenadas GAV?

a) Group, Action, Value

b) GroupId, ArtifactId, Version

c) Git, Apache, Version

d) General, Application, Version

💡 Ver a solução

Resposta: b) — GAV = groupId, artifactId, version: a identidade única do projeto.


Question 2

O que significa o sufixo -SNAPSHOT numa versão?

a) Uma versão publicada e congelada

b) Uma versão em desenvolvimento, instável e atualizada com frequência

c) Uma captura de ecrã do projeto

d) Uma versão obsoleta

💡 Ver a solução

Resposta: b)-SNAPSHOT indica uma versão de desenvolvimento. Uma versão sem este sufixo é uma release congelada.


Question 3

Para que serve o bloco <properties>?

a) Para declarar as dependências

b) Para definir variáveis reutilizáveis (versões, encoding) com ${...}

c) Para configurar o servidor web

d) Para escrever o código Java

💡 Ver a solução

Resposta: b) — As propriedades centralizam valores reutilizáveis via a sintaxe ${nom}, evitando as repetições.


Question 4

Qual é a vantagem de herdar de um <parent> como spring-boot-starter-parent?

a) Elimina a necessidade de código

b) Garante versões de bibliotecas coerentes e reduz a configuração

c) Acelera a rede

d) Cifra o pom.xml

💡 Ver a solução

Resposta: b) — O parent fixa versões compatíveis entre si; pode então declarar dependências sem precisar a versão.


Question 5

Que valor toma sempre <modelVersion> hoje?

a) 1.0.0

b) 3.9.6

c) 4.0.0

d) 17

💡 Ver a solução

Resposta: c)<modelVersion>4.0.0</modelVersion> é a versão do formato de ficheiro pom.xml, obrigatória e invariável.

↑ Voltar ao topo


8 — Prática — Redigir um pom.xml

Instrução

Redija de raiz um pom.xml para um projeto identificado por com.banque:gestion-comptes:1.0.0-SNAPSHOT, empacotado em jar, compilado em Java 17 com encoding UTF-8, e a centralizar a versão do JUnit numa propriedade. Depois verifique-o.


Correção — pom.xml esperado

xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.banque</groupId>
    <artifactId>gestion-comptes</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>5.10.2</junit.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

Verificação:

bash
# Verifica que o pom é válido e resolúvel
mvn validate

# Mostra o pom efetivo (parent e propriedades resolvidos)
mvn help:effective-pom

Resultado esperado:

[INFO] BUILD SUCCESS

Se mvn validate mostrar BUILD SUCCESS, o seu pom.xml está sintaticamente correto e todas as coordenadas estão bem formadas. Um erro frequente: esquecer <modelVersion> ou fechar mal uma etiqueta XML.

↑ Voltar ao topo


9 — Síntese

Pontos a reter

  1. O pom.xml é um ficheiro XML que descreve identidade, propriedades, dependências e build.
  2. As coordenadas GAV (groupId, artifactId, version) identificam o projeto de forma única.
  3. -SNAPSHOT = versão em desenvolvimento; sem sufixo = versão publicada congelada.
  4. As <properties> centralizam variáveis reutilizáveis via ${nom}.
  5. A herança <parent> fatoriza a configuração e garante versões coerentes.

A continuação

Lição 03 — Gestão das dependências: declarar bibliotecas, compreender os âmbitos, os repositórios e a resolução transitiva.

↑ 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