Controle de Versão no Maven

Em projetos Maven, é possível passar dinamicamente números de versão durante o build usando parâmetros JVM (-D), combinados com propriedades Maven (<properties>) ou filtragem de recursos (Resource Filtering). Veja abaixo as abordagens disponíveis:

1. Abordagem: Sobrescrita de Propriedades via -D

O Maven permite que parâmetros -D sobrescrevam propriedades definidas no pom.xml, incluindo a versão do projeto.

Procedimento

(1) Definir propriedade de versão no pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.exemplo</groupId>
    <artifactId>meu-projeto</artifactId>
    
    <!-- Definição da propriedade de versão (valor padrão) -->
    <properties>
        <versao.app>1.0.0-SNAPSHOT</versao.app>
    </properties>
    
    <!-- Utilização da propriedade de versão -->
    <version>${versao.app}</version>
    
    <!-- Demais configurações... -->
</project>

(2) Passar versão via -D

No momento do build, sobrescreva versao.app:

mvn clean install -Dversao.app=2.0.0-RELEASE

  • O Maven utilizará 2.0.0-RELEASE em vez do valor padrão 1.0.0-SNAPSHOT definido no pom.xml.

Quando utilizar

  • Pipelines CI/CD: passagem dinâmica de versões (exemplo: 1.0.0-${BUILD_NUMBER}).
  • Depuração local: troca rápida de versões para testes.

2. Abordagem: Uso do flatten-maven-plugin (Recomendado)

Para gravar a versão dinâmica no pom.xml final (por exemplo, para publicação em repositórios Nexus), utilize o flatten-maven-plugin para substituir variáveis durante o build.

Procedimento

(1) Configurar o flatten-maven-plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>flatten-maven-plugin</artifactId>
            <version>1.6.0</version>
            <configuration>
                <updatePomFile>true</updatePomFile>
                <flattenMode>resolveCiFriendliesOnly</flattenMode>
            </configuration>
            <executions>
                <execution>
                    <id>flatten</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>flatten</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

(2) Utilizar ${revisao} para definir a versão

<properties>
    <revisao>1.0.0-SNAPSHOT</revisao>
</properties>

<version>${revisao}</version>

(3) Passar versão via -D

mvn clean install -Drevisao=2.0.0-RELEASE

  • O plugin substitui ${revisao} por 2.0.0-RELEASE e gera um arquivo pom.xml.flatten (altera o pom.xml original se updatePomFile=true).

Vantagens

  • O POM gerado contém a versão real, adequado para publicação em repositórios.
  • Suporta versões dinâmicas em CI/CD (exemplo: 1.0.0-${HASH_COMMIT_GIT}).

3. Abordagem: versions-maven-plugin para Alterações em Lote

Para modificar a versão antes do build (não dinamicamente), utilize o versions-maven-plugin.

Procedimento

(1) Configurar o plugin

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>versions-maven-plugin</artifactId>
    <version>2.16.0</version>
</plugin>

(2) Especificar nova versão via -D

mvn versions:set -DnewVersion=2.0.0-RELEASE

  • Este comando modifica todos os arquivos pom.xml dos módulos, exigindo commmit no Git.

Quando utilizar

  • Upgrade manual da versão do projeto (sem passagem dinâmica).

4. Abordagem: Filtragem de Recursos para Arquivos de Configuração

Para gravar a versão em arquivos de configuração da aplicação (como application.properties), combine resource filtering com o parâmetro -D.

Procedimento

(1) Ativar filtragem de recursos no pom.xml

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

(2) Referenciar propriedade de versão no arquivo de configuração

src/main/resources/application.properties:

app.version=${project.version}

(3) Passar versão via -D

mvn clean package -Dversao.app=2.0.0-RELEASE

  • Após o build, ${project.version} em application.properties será substituído por 2.0.0-RELEASE.

Observação

  • Este método afeta apenas arquivos de recursos, não modifica o <version> no pom.xml.

5. Herança de Versão entre Módulos

Utilize <parent> + variáveis (recomendado) No POM pai, defina a versão como variável; módulos filhos referenciam via ${project.parent.version}.

Procedimento

  • POM pai (pom.xml):
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.exemplo</groupId>
    <artifactId>projeto-pai</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
 
    <properties>
        <versao.principal>1.0.0</versao.principal>
    </properties>
</project>

  • Módulo filho (modulo-filho/pom.xml):
<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.exemplo</groupId>
        <artifactId>projeto-pai</artifactId>
        <version>1.0.0</version>
    </parent>
 
    <artifactId>modulo-filho</artifactId>
    <!-- Forma 1: omitir <version> (requer Maven 3.5.0+) -->
    <!-- Forma 2: referenciar versão do pai explicitamente -->
    <version>${project.parent.version}</version>
    <!-- Ou usar variável definida no POM pai -->
    <version>${versao.principal}</version>
</project>

Vantagens

  • Versão centralizada no POM pai.
  • Módulos filhos não precisam repetir a definição (Maven 3.5.0+ permite omitir <version>).

Atenção

Se omitir <version> no módulo filho, certifique-se de que a <version> do POM pai seja fixa (não pode ser variável como ${revisao}).

6. Exemplo Completo

Configuração do pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.exemplo</groupId>
    <artifactId>meu-projeto</artifactId>
    
    <properties>
        <versao.app>1.0.0-SNAPSHOT</versao.app>
    </properties>
    
    <version>${versao.app}</version>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>flatten-maven-plugin</artifactId>
                <version>1.6.0</version>
                <configuration>
                    <updatePomFile>true</updatePomFile>
                </configuration>
                <executions>
                    <execution>
                        <id>flatten</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>flatten</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Comando de Build

mvn clean install -Dversao.app=2.0.0-RELEASE

Tabela Resumo

Abordagem Cenário de Uso Modifica pom.xml Suporte CI/CD
-D para sobrescrever propriedades Versões dinâmicas simples Não (sobrescrita em tempo de execução) Sim
flatten-maven-plugin Publicação em repositório Sim (gera POM achatado) Sim
versions-maven-plugin Upgrade em lote Sim (modifica arquivos) Não (requer commit Git)
Filtragem de recursos Gravar em arquivos de configuração Não (apenas recursos) Sim
Herança pai/filho Não Sim (é possível alterar versão do POM pai em tempo de execução)

Sugestões de Uso

  • Versões dinâmicas em CI/CD: utilize flatten-maven-plugin + -Drevisao.
  • Depuração local: simplesmante sobrescreva via -Dversao.app.
  • Upgrade em lote: empregue o versions-maven-plugin.

Tags: maven java build-automation dependency-management devops

Publicado em 6-26 19:14